gpt4 book ai didi

调用非静态方法的Java静态引用变量

转载 作者:行者123 更新时间:2023-11-30 10:10:59 24 4
gpt4 key购买 nike

class A{
void display(){
System.out.println("hai");
}
}
class B {
static A a;
}
class C{
public static void main(String args[])
{
B.a.display();
// no compile- time error here.why?
}
}

我还知道 a 在运行时将被设置为 null。但是编译器不应该知道我们正在访问一个非静态方法通过静态引用变量?这在执行时给出了一个空指针异常,但是为什么编译器没有给出一个错误。

这是否意味着静态引用变量的行为与对象引用完全一样,因此可以调用类的任何方法(静态和非静态)?

编辑:我基本上对静态字段的访问规则感到困惑。根据定义,静态字段只能直接访问其他静态字段。那么这不包括“调用”使用静态引用变量的方法吗?并且在创建其对象之前访问 display() 。这有效吗?

最佳答案

“你一直在用那个词。我不认为它意味着你认为的意思。”

您的代码中的 static A a; 表示,“a 是一个(对)共享的 A 类型的对象B 类的所有实例。a 未初始化。”。

编译器将没有上下文来确定何时调用 C 类的静态 main() 方法,因此它无法判断状态是什么变量 a 将在您调用 C.main(); 时出现。事实上,你可以很容易地拥有一个 D 类:

class D
{
public static void main( String args[] )
{
B.a = new A();
C.main( args );
}
}

这将使上面的代码完全有效且可运行。

关于调用非静态方法的Java静态引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52654818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com