【问题标题】:Global variables and constructor(Java)全局变量和构造函数(Java)
【发布时间】:2013-03-10 23:22:58
【问题描述】:

与构造函数相比,类顶部的变量何时初始化?

对不起,我是这个意思:

public class aClass {

    private int num;

    public aClass {...}

【问题讨论】:

  • 你是指静态变量还是成员变量?
  • 不就是叫实例变量吗?
  • @John 你不能在类之外声明任何变量。
  • @nickecarlo 是的,他们不认为他们的班级是全球性的吗?
  • @AliAlamiri “范围内的全局”的想法毫无意义。 “全球”几乎是“范围”的反义词。 OP 问题中的num 是一个常规的旧字段,或“实例变量”。

标签: java oop class variables


【解决方案1】:

就发出的字节码而言,从技术上讲,默认值(对象字段的null,原始字段的0 等)从未显式分配。 (这是在对象实例化期间“内部”完成的,在任何初始化器/构造器代码运行之前。)

实例字段的显式初始化代码在每个构造函数的开头“复制”,编译器在类中调用超类构造函数(如果有的话)。代码示例:

class Foo {
    int bar = 123;

    public Foo() {
        // ...
    }

    public Foo(int bar) {
        this.bar = bar;
        // ...
    }
}

被编译成相当于:

的字节码
class Foo {
    int bar;

    public Foo() {
        this.bar = 123;
        // ...
    }

    public Foo(int bar) {
        this.bar = 123;

        this.bar = bar;
        // ...
    }
}

初始化块也是如此。这意味着这些变量会在任何正常的构造函数代码执行之前被初始化。

【讨论】:

  • 我不确定这些是否完全等效(至少在一般情况下)。见stackoverflow.com/a/14663906/129570
  • @OliCharlesworth 对,我改写了一些答案,并包含了该答案中的相关信息。
【解决方案2】:

用值定义的成员在构造函数中被初始化,就像任何其他成员一样。但这不完全是您编写的构造函数; Java 通过在其开头插入成员初始化程序和初始化程序块来更改幕后的每个构造函数。如果您想暂时查看它,您可以将其视为在构造函数之前初始化的成员。

【讨论】:

    【解决方案3】:

    实际上,您可以在调用构造函数之前将它们视为已初始化。所以如果你有:

    class Dog {
       private String voice = "woof";
    
       public Dog() {
          System.out.println(voice); 
       }
    
    }
    

    您将成功地将“woof”打印到控制台,而不是 null

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2017-05-18
      相关资源
      最近更新 更多