【发布时间】:2020-03-29 15:52:19
【问题描述】:
我正在学习 Java 中的一些基本 OOP 概念。考虑以下代码 sn-p:
class my_class{
int a;
public my_class() {
System.out.print(a+" ");
a = 10;
System.out.print(a);
}
}
class Main{
public static void main(String[] args) {
my_class my_object = new my_class();
}
}
以下代码的输出为:0 10
据我了解:
-
my_class是类名 -
my_object是我正在创建的对象的引用 -
new运算符分配内存并返回它的地址,该地址存储在my_object -
my_class()是构造函数,它使用默认值 0 初始化对象的字段,然后将其分配为 10
现在考虑代码:
class my_class{
final int a;
public my_class() {
a=10;
System.out.print(a);
}
}
class Main{
public static void main(String[] args) {
my_class my_object = new my_class();
}
}
根据我之前的理解,它应该创建 my_object 并将字段 final int a 设置为默认值 0,这应该是不可更改的,并在 a=10; 处标记错误,但它可以工作并打印输出:10
我哪里错了?
【问题讨论】:
-
因为你可以在构造函数中初始化
final变量。这就是它的用途。 -
为什么你认为应该是
0? -
@MarkRotteveel 我认为是因为前面的代码。我假设每次创建一个对象时,它的字段都使用默认值(0/0.0/null)初始化,然后如果我们愿意,我们可以通过构造函数为其分配一个新值。
-
未显式初始化的
final字段可能具有默认值 0/null,但始终必须在构造函数中显式初始化才能使用。在某些极端情况下,您可以“看到”final字段的默认值,但对于正常使用,final字段应被视为没有任何值。
标签: java oop constructor new-operator final