【问题标题】:Static members in Java [duplicate]Java中的静态成员[重复]
【发布时间】:2011-01-10 18:54:11
【问题描述】:

我读过 Java 中的静态不是继承的。我有一个小程序,它在运行时编译并生成2 2 作为输出。从程序来看,k(一个静态变量)似乎被继承了!!我做错了什么?

class Super
{
    int i =1;
    static int k = 2;
    public static void print()
    {
        System.out.println(k);
    }
}
class Sub extends Super
{
    public void show()
    {
        // I was expecting compile error here. But it works !!
        System.out.println(" k : " + k);
    }
    public static void main(String []args)
    {
        Sub m =new Sub();
        m.show();
        print();
    }
} 

【问题讨论】:

  • 没听说过,你的假设可能是错误的。
  • 我在这里读到的:stackoverflow.com/questions/1740528/…
  • 如果您阅读了上面的 cmets,发帖人将“继承”理解为“继承并具有通过多态运行时调度覆盖的能力”,这有点不合常规且容易混淆。
  • @Pete:我明白了,所以我得出结论,父类的静态变量是由子类继承的?
  • @gameover: 静态变量不是继承的,它们是可用的

标签: java


【解决方案1】:

Sub 扩展 Super,因此它可以看到 Super 的所有公共/受保护/包(静态)成员。

我猜这就是您所说的“Java 中的静态信息不被继承” 改变

static int k = 2;

private static int k = 2;

你的子程序不会再看到“k”,也不会编译;

也尝试创建一个新的'static int k=3;'在 Sub 中,看看会发生什么。

【讨论】:

    【解决方案2】:

    名称查找的范围包括超类。

    Sub 中找不到名称print,因此在Super 中解析。

    当编译器生成字节码时,将调用Super.print,而不是调用Sub 中的方法。

    类似地,k 在子类中可见,无需对其进行限定。


    这里没有多态性,只有命名空间内容的继承。静态方法和所有字段在 Java 中没有多态分派,所以只能被子类隐藏,不能被覆盖。您在 cmets 中链接到的帖子以某种非常规的方式使用“继承”,将其与多态性混合在一起。你可以有没有继承的多态性和没有多态性的继承。

    【讨论】:

    • “可见”和“继承”不一样吗?
    • 如果类 A 有一个公共方法“doSomething()”,那么类 B 可以访问 A.doSomething()。这意味着 A.doSomething() 对于 B 调用是“可用的”。但是,您真的认为 B “继承”了 A.doSomething() 吗? ;-)
    • 如果 B 扩展 A,是的,你描述的是继承。如果 B 不扩展 A,那么您描述的是使用。您可以使用委托给的对象来模拟继承;早期的 VB COM 正是这样做的——它具有多态性,但没有继承性。
    【解决方案3】:

    我认为您对不继承静态变量的看法可能是错误的。我想它的某些属性不是继承的。例如,静态 var 通常意味着该类的所有实例都可以访问内存中的同一位置。

    当你继承时,派生类不会和基类引用相同的内存。

    【讨论】:

    • 最后一句是假的。如果只在基类中定义静态变量,那么内存中只会有一个变量的实例。所有对该静态成员的引用(来自基类或派生类)都将修改单个实例。
    【解决方案4】:

    这与访问Math.PI 或任何其他全局常量(也有publicfinal 修饰符)几乎相同。

    在你的情况下,你有默认(包)范围。

    它与继承无关,只是作用域限制了它是否可见。

    【讨论】:

      【解决方案5】:

      静态成员可以是静态数据成员和静态方法,无需使用对象即可访问。它被嵌套类使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 2012-07-24
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多