Java 将静态类变量绑定到非静态实例变量。创建新对象时是否有效?
假设我面前有以下代码:Java 将静态类变量绑定到非静态实例变量。创建新对象时是否有效?,java,variables,static,initialization,Java,Variables,Static,Initialization,假设我面前有以下代码: public class Theory { public static void main(String[] args) { new Theory().program(); } void program(){ A.a = A.b; //won't compile A.a = new A().b; A.b = A.a; // won't compile either new A().b =
public class Theory {
public static void main(String[] args) {
new Theory().program();
}
void program(){
A.a = A.b; //won't compile
A.a = new A().b;
A.b = A.a; // won't compile either
new A().b = A.a
}
static class A{
static int a;
int b;
}
}
当我将鼠标悬停在代码上时,它会说“非静态字段不能从静态上下文引用”,这我有点理解,但我不明白为什么连续行没有显示编译器错误
A.a = A.b; // You can't reference an instance field (b) statically
A.a = new A().b; // You create an instance of A, use it to access 'b' and assign
// it to 'a' which you can access statically. This is okay.
A.b = A.a; // You can't reference an instance field (b) statically
new A().b = A.a; // This works, but the instance is gone (not
// assigned anywhere) once the assignment is complete.
static class A {
static int a;
int b;
}
注意。不要被
静态类
声明所迷惑。这意味着可以实例化嵌套类,而不需要封闭类的实例。这并不意味着它的字段或方法可以自动静态访问。您看到的更像是IDE生成的“工具提示”,因为鼠标悬停是IDE函数,与编译器无关。显示的消息完全取决于IDE,如果您更改IDE,消息可能会更改。编译器错误只有在实际尝试编译代码时才会出现 这两行都无法编译的原因是,在任何情况下,您都试图访问一个实例绑定字段,而不使用and实例,即“A.b”。
另外两行是编译的,因为在这两种情况下,您都创建了类的一个新实例,并通过它访问实例绑定字段,即new a()。b没有任何东西命名为
a.b
b
是非静态的,因此您可以访问其中一个的唯一方法是SomeInstanceFacreatedWithNew。b
换句话说。。。请研究在内部类的定义中添加static的实际含义。