我有这两个类
public class B {
int mB = 5;
public int getBValue(){
return mB;
}
}
public class A {
int mA = b.getBValue();
public static void main(String [] args){
B b = new B();
System.out.println(mA);
}
}
编译器说"找不到符号b"。我理解代码首先从main方法执行并按行顺序排列。因此,当编译器读取代码时,它首先进入" B b = new B();
"然后b成为定义。这是真的吗?范围错了吗?
我理解的第二种状态:
public class B {
static int mB = 5;
public static int getBValue(){
return mB;
}
}
public class A {
static int mA = B.getBValue();
public static void main(String [] args){
System.out.println(mA);
}
}
此状态正常。静态属于类本身,不属于任何对象。所以当程序运行时,所有静态加载和初始化。
那么这两个国家之间的关键点在哪里?
答案 0 :(得分:2)
我理解代码首先从main方法执行并按行顺序排列。
这是完全正确的。但是,来自main
(或来自任何其他方法)的变量不能在class A
的字段初始值设定项中使用,它们在它们自己的上下文中作为类构造函数的一部分执行。 / p>
当编译器读取代码首先转到
B b = new B();
然后b
被定义为真的
是的,b
定义为其范围的其余部分,即直到main
的右括号。
那么这两个国家之间的关键点是什么?
本练习的主要内容是,字段初始化程序可以自由访问静态字段和方法;他们无法访问任何其他方法,包括构造函数参数和任何方法的局部变量。此外,参数和当地人对自己方法之外的所有事物都是禁止的。
答案 1 :(得分:0)
这里:
public class A {
int mA = b.getBValue();
public static void main(String [] args){
B b = new B();
System.out.println(mA);
}
}
b
对A
实例不可见,因为它是main()
方法中的局部变量。其范围仅限于main
()方法
为了可见,它应该在A类中声明为静态字段。
这里:
public class B {
static int mB = 5;
public static int getBValue(){
return mB;
}
}
public class A {
static int mA = B.getBValue();
public static void main(String [] args){
System.out.println(mA);
}
}
有效:
static int mA = B.getBValue();
因为在此范围内可以访问B.getBValue()
。无论如何,B.getBValue()
指的是一个公共静态方法,根据定义,公共静态方法随处可见。由于它是静态的,它不需要任何实例,因为它是公共的,任何类都可以调用它。