Java 如何通过对象引用静态字段?
我了解什么是静态,但我找不到通过对象引用静态字段的信息 让我们假设我们有两个类:Java 如何通过对象引用静态字段?,java,oop,static,Java,Oop,Static,我了解什么是静态,但我找不到通过对象引用静态字段的信息 让我们假设我们有两个类: 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.
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),元空间中有两个类(简化)
当我们通过类访问静态字段时:
int valFromClass = Foo.statValue;
这很容易,因为我假设我们在元空间中引用类对象。但是如何通过对象访问静态成员呢?当我们写作时:
int valFromObject = foo1.statValue;
Foo实例是实际涉及的还是被绕过并
foo1.statValue;
Foo.statValue
是同义词吗?该实例实际上未被使用。Java使用变量的类型,然后读取静态(类)字段 这就是为什么即使是具有正确类型的null也不会引发null指针异常的原因 试试这个:
Foo foo1 = null;
int valFromObject = foo1.statValue; //will work
或者这个:
int valFromNull = ((Foo)null).statValue; //same thing
由于明显的原因,不鼓励通过实例访问静态类成员(在我看来,最重要的是存在引用实例成员的错觉)。Java允许使用带有警告的
foo1.statValue
(“静态字段Foo.statValue应以静态方式访问”
,正如我的IDE所报告的那样)。该实例实际上没有被使用。Java使用变量的类型,然后读取静态(类)字段
这就是为什么即使是具有正确类型的null也不会引发null指针异常的原因
试试这个:
Foo foo1 = null;
int valFromObject = foo1.statValue; //will work
或者这个:
int valFromNull = ((Foo)null).statValue; //same thing
由于明显的原因,不鼓励通过实例访问静态类成员(在我看来,最重要的是存在引用实例成员的错觉)。Java允许使用
foo1.statValue
,并带有警告(“静态字段Foo.statValue应以静态方式访问”
,正如我的IDE所报告的那样)。foo1的静态类型(用于声明变量的类型,在本例中为Foo
)用于访问静态字段。实际实例不起作用。请注意,foo1.statValue
将产生编译器警告。您甚至不应该这样编写代码。静态类型foo1
(用于声明变量的类型,在本例中为Foo
)用于访问静态字段。实际实例不起作用。请注意,foo1.statValue
将产生编译器警告。你甚至不应该写这样的代码。我仍然想知道为什么他们允许foo1.statValue首先是代码>我还在想为什么他们允许foo1.statValue代码>首先。