Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将静态类变量绑定到非静态实例变量。创建新对象时是否有效?_Java_Variables_Static_Initialization - Fatal编程技术网

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的实际含义。