我想知道是什么意思,说一个字段2 Java类和什么导致输出方面运行的代码时,它意味着之间隐藏?
我有一个抽象类protected static boolean field = false
,并且具有相同名称的布尔领域,但也不是一成不变的,并设置为一个子类true
。
如果我有这样的代码:
Superclass d = new subclass();
这将是在子类中的父类和布尔字段的布尔字段的值? 难道子场留为false
上述分配后?
我想知道是什么意思,说一个字段2 Java类和什么导致输出方面运行的代码时,它意味着之间隐藏?
我有一个抽象类protected static boolean field = false
,并且具有相同名称的布尔领域,但也不是一成不变的,并设置为一个子类true
。
如果我有这样的代码:
Superclass d = new subclass();
这将是在子类中的父类和布尔字段的布尔字段的值? 难道子场留为false
上述分配后?
static
成员从不(非静态成员当然也不是)覆盖。 既然你应该像这样访问他们: ClassName.member
也没有必要担心隐藏它们。
在你的情况,你就可以访问Superclass
领域是这样的: Superclass.field
。 和领域Subclass
这样的实例: subclass.field
。 如果你有,但一个Subclass
的实例Superclass
像上面的变量,这个代码: d.field
将访问中定义的静态字段Superclass
,这将是false
,你的情况。
但是,这并不能改变价值Subclass
的实例,它只是访问“错误”的成员! 你可以把例如在验证这个d
回到一个Subclass
变量和阅读field
一次。
如果类声明的字段具有特定名称,那么该字段的声明说, 隐藏在超具有相同名称字段的任何和所有可访问的声明和类的超级。
隐藏字段可以通过使用限定名,如果它是被访问
static
,或通过使用包含该关键字的字段访问表达式super
或流延到一个超类类型。
查看更多在http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html
class A { static int field; } class B extends A { int field; void doSomething() { System.out.println(super.field); // From A System.out.println(field); // From B } } class Main { public static void main(String[] args) { B b = new B(); System.out.println(b.field); // From B System.out.println(((A) b).field); // From A System.out.println(A.field); // From A } }
这将是在子类中的父类和布尔字段的布尔字段的值?
值field
中的超可变仍将虚假和价值field
中的子类仍将如此。
难道子场停留上述分配后为FALSE?
不,你不能在Java中覆盖静态变量。 什么实际上发生的事情是在子类中的定义隐藏在超类中声明的变量。
对于一个很好的例子和说明,请参阅SO问题
我也建议你自己尝试一下,看看会发生什么。