我从来没有真正发现一个变量声明实际上是在程序中实际运行的,而变量位于另一个类中。
例如:
public static void main(String[] args) {
int x = 1;
System.out.println(x);
}
就声明何时运行而言,该程序似乎相当简单。
但是请考虑以下问题:
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
Test2 test2 = new Test2();
System.out.println(test2.y);
}
}
public class Test2 {
public int y = 1;
}
和:
public class Test {
public static void main(String[] args) {
System.out.println(Test2.y);
}
}
public class Test2 {
public static int y = 1;
}
什么时候
public int y = 1;
声明是否曾在此程序中运行?它只能直接调用,但实际上并不像第一个示例那样顺序运行。我们将对此进行一些澄清。
答案 0 :(得分:0)
在内存中创建了一个引用为test2的对象时,您写此Test2 test2 = new Test2();
时,该对象的一个属性为y
,其值分配为1
。因此,在创建对象“ test2”的过程中,执行了行public int y = 1;
。
答案 1 :(得分:0)
您正在研究的概念是变量绑定(基本上将变量与其数据类型和值相关联)。
此外,我将在此处重点介绍另外两件事。
第一: System.out.println(Test2.y);
是错误的,因为您不能以静态方式打印或访问任何非静态变量。
第二:在下面的代码中:
public Test() {
Test2 test2 = new Test2();
System.out.println(test2.y);
}
您会看到我们已经在Test类的构造函数中聚合了Test2类对象,因此Test类的任何新对象都将具有Test2实例,因此您的代码将在这方面成功打印1。public int y = 1;
是一个声明&在编译时运行的定义,即该变量的绑定发生在编译时。您可以探索更多有关编译时和运行时绑定的知识,以获取有关此概念的更多知识。