【问题标题】:Initialization of object in JavaJava中对象的初始化
【发布时间】: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

据我了解:

  1. my_class 是类名
  2. my_object 是我正在创建的对象的引用
  3. new 运算符分配内存并返回它的地址,该地址存储在 my_object
  4. 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


【解决方案1】:

您可以一次初始化任何final 字段,要么在构造函数中(即每个构造函数一次),或在其声明中。

(值得注意的是,如果您希望构造函数的参数在最终变量的值中起作用,则必须在构造函数中对其进行初始化——否则最终变量将毫无用处!)

【讨论】:

  • 不能连同它的声明一起初始化最终变量吗?
  • @MayankMittal 是的,但是你不能在构造函数中再分配它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多