Java中的静态成员

时间:2010-01-29 09:39:35

标签: java

我读过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();
    }
} 

5 个答案:

答案 0 :(得分:3)

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

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

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

同样地,k在子类中可见而没有限定它。


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

答案 1 :(得分:0)

Sub扩展Super以便它可以看到Super。

的所有公共/受保护/包(静态)成员

我想这就是你所描述的“Java中的静态不继承” 变化

static int k = 2;

private static int k = 2;

你的Sub程序将不会再看到'k'而且不会编译;

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

答案 2 :(得分:0)

它与访问Math.PI或任何其他全局常量(也包含publicfinal修饰符)非常相似。

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

它仅仅依赖于继承,范围限制它是否可见。

答案 3 :(得分:-1)

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

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

答案 4 :(得分:-1)

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

使用