gpt4 book ai didi

java - 继承的静态成员的意外行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:21:07 25 4
gpt4 key购买 nike

我只是在玩弄 static 和继承,看看可以做什么,不能做什么。我以前读过,静态方法不能被覆盖,它们可以简单地隐藏起来。这就是为什么我试图了解什么适用于静态成员。这是一些简单的测试代码:

public class ParentClass {
public static String x;
{ x = "In ParentClass"; }
}

public class ChildClass extends ParentClass {
{ x = "In ChildClass"; }
}

现在,当我打印 x called from objects 时,一切都按预期进行:

ParentClass parentClassReference = new ParentClass();
System.out.println(parentClassReference.x); // prints: "In ParentClass"

parentClassReference = new ChildClass();
System.out.println(parentClassReference.x); // prints: "In ChildClass"

即使是从子类对象对 x 的微不足道的调用:

ChildClass childClassReference = new ChildClass();
System.out.println(childClassReference.x); // prints: "In ChildClass"

现在,当我调用静态成员时,就像它应该完成的那样,它变得很奇怪:

System.out.println(ChildClass.x); // prints: "In ChildClass" (Ok, so far.)
System.out.println(ParentClass.x); // prints: "In ChildClass" (This is unexpected.)

我无法解释这种行为。在 Overriding vs. Hiding (Code Ranch) 的背景下似乎更有可能通过对象的调用不应该按预期工作,但通过类名的调用应该。

我很困惑。谁能帮忙?

最佳答案

您的代码非常很奇怪...但结果完全符合我的预期。

你需要明白三件事:

  • 这里只有一个 x 变量。无论您将其引用为 ChildClass.x 还是 ParentClass.x,它都是同一个变量
  • 当您通过引用 引用静态成员时,编译器只是将其转换为静态引用,根本不会查看引用的值。所以childClassReference.x等同于ChildClass.x,实际上编译为ParentClass.x。好的 IDE 会警告您这种事情 - 它会产生令人困惑的代码。
  • 您编写的设置 x 值的代码仅基于构造函数调用执行。基本上它等同于:

    public class ParentClass {
    public static String x;
    public ParentClass() {
    x = "In ParentClass";
    }
    }

    public class ChildClass extends ParentClass {
    public ChildClass() {
    x = "In ChildClass";
    }
    }

从根本上说,您不应该尝试通过静态成员实现任何类型的多态性。它不起作用,伪造它的尝试不会幸福地结束。

关于java - 继承的静态成员的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12315205/

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