我读过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();
}
}
答案 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
或任何其他全局常量(也包含public
和final
修饰符)非常相似。
在您的情况下,您有默认(包)范围。
它仅仅依赖于继承,范围限制它是否可见。
答案 3 :(得分:-1)
我认为你可能错误的是静态变量没有被继承。我想它的一些属性不是继承的。例如,静态var通常意味着类的所有实例都可以访问内存中的相同位置。
继承时,派生类不会引用与基类相同的内存。
答案 4 :(得分:-1)
静态成员可以是静态数据成员和静态方法,无需使用该对象即可访问。它由嵌套类
使用