代码之家  ›  专栏  ›  技术社区  ›  swch

如何通过对象引用静态字段?[复制品]

  •  0
  • swch  · 技术社区  · 6 年前

    这个问题已经有了答案:

    • <一个HREF =“/问题/ 9765445 /访问一个静态变量VIA-对象引用在Java中”dir=“LTR”>通过一个对象引用在Java 中访问静态变量 5答
    • < HRFF=“/问题/ 5562321 /什么是访问Java中静态字段的正确方法”DIR=“LTR”>什么是访问Java静态字段的正确方法? 6答

    我知道什么是静态的,但我找不到通过对象引用静态字段的信息。

    假设我们有两个班:

    类foo{
    静态int statvalue=10;
    }
    
    类栏{
    公共静态void main(string[]args){
    foo foo1=新foo();
    int valfromobject=foo1.statvalue;
    
    int valfromclass=foo.statvalue;
    }
    }
    < /代码> 
    
    

    当我们运行这个程序时,堆上有一个对象(foo1),元空间中有两个类(简化)。

    当我们通过类访问静态字段时:

    int valfromclass=foo.statvalue;
    < /代码> 
    
    

    这很容易,因为我假设我们在元空间中引用类对象。但是静态成员是如何通过对象访问的呢?当我们写作时:

    int valfromobject=foo1.statvalue;
    < /代码> 
    
    

    是否实际涉及foo实例,或者它被绕过,并且

    foo1.statvalue;
    状态值
    < /代码> 
    
    

    是同义词吗?[答:] 5答

  • What is the proper way of accessing static fields in Java? 6答
  • 我知道什么是静态的,但是我找不到通过对象引用静态字段的信息。

    假设我们有两个类:

    class Foo {
        static int statValue = 10;
    }
    
    class Bar {
        public static void main(String[] args) {
            Foo foo1 = new Foo();
            int valFromObject = foo1.statValue;
    
            int valFromClass = Foo.statValue;
        }
    }
    

    当我们运行这个程序时,堆上有一个对象(foo1),元空间中有两个类(简化)。

    enter image description here

    当我们通过类访问静态字段时:

    int valFromClass = Foo.statValue;
    

    这很容易,因为我假设我们在元空间中引用类对象。但是静态成员是如何通过对象访问的呢?当我们写:

    int valFromObject = foo1.statValue;
    

    是否实际涉及foo实例,或者它被绕过,并且

    foo1.statValue;
    Foo.statValue
    

    是同义词吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   ernest_k Petronella    6 年前

    实例实际上未使用。Java使用变量的类型,然后读取静态(类)字段。

    这就是为什么即使具有正确类型的空也不会引发空指针异常的原因。

    试试这个:

    Foo foo1 = null;
    int valFromObject = foo1.statValue; //will work
    

    或者:

    int valFromNull = ((Foo)null).statValue; //same thing
    

    不鼓励通过实例访问静态类成员,原因很明显(在我看来,最重要的是错误地引用了实例成员)。Java使用 foo1.statValue ,带有警告( "The static field Foo.statValue should be accessed in a static way" 据我的IDE报告)。