62,615
社区成员
发帖
与我相关
我的任务
分享
class A{
int a;
void fun1(){
}
class AInner{
}
}
class B extends A{
}
public class TestA {
public static void main(String[] args) throws Exception {
AA a = new AAA();
System.out.println(AA.class.getField("a").get(a));
System.out.println(AAA.class.getField("a").get(a));
}
}
class AA {
public int a = 0;
}
class AAA extends AA {
public int a = 1;
}
// 0
// 1
这两个都是public的属性,通过AA.class和通过AAA.class去访问同一个对象,得到的却是两个值
这说明,属性天生就是不适用于继承关系的,即使是public的属性,也不能继承和覆盖,仅仅是子类能够通过作用域被访问到父类而已
综上,继承原则是设计上的原则,实际上编译器只是遵守public、protected、(default)、private四个作用域。
属性和方法在存储方式上的不同决定了,子类的属性不能覆盖父类的属性,子类的方法可以覆盖父类的方法。
所以为了安全,继承的时候,用方法而不是属性。public class Test extends A{
public void test(){
this.a = "Test的a。。。";
super.a = "父类A的a。。。";
System.out.println(this.a);
A.Inner in = new A().new Inner();
System.out.println(in.b);
Test.Inner testIn = new Test().new Inner();
System.out.println(testIn.b);
testIn.b = "----";
System.out.println(testIn.b);
System.out.println(in.b);
}
public static void main(String[] args) {
Test t = new Test();
t.test();
}
}
class A{
String a;
class Inner{
String b = "==";
}
}
结果:
父类A的a。。。
==
==
----
==