java 三大属性
封装,继承,多态
如果对于一般的方法的覆盖,大家一般都可以判断出来
但是对于子类的属性覆盖,还是需要时间分析
class A { int a = 100; void f() { System.out.println(a); } } class B extends A { int a = 9999; void f() { System.out.println(a); System.out.println(this.a); System.out.println(super.a); } } public class test{ public static void main(String[] args) { A a = new B(); System.out.println(a.a); //100 a.f(); //999 9999 100 System.out.println("======================"); B b = new B(); b.f(); // //999 9999 100 System.out.println("======================="); ((A) a).f(); // //999 9999 100 } }
对于这到题的答案,在后面,
分析 class B 有两个属性A,一个是父类的,还有一是自己,
如果在类里面,直接访问A这个属性,就近原则,会直接访问最近的A,
所以访问需下面的这个A属性,会访问父类A这个属性,子类的A属性,会被屏蔽掉
A a = new B(); System.out.println(a.a); //100
再说一个小问题
class A{
private String name;
}
class B extentds A{
}
其实,B 有 name 这个属性,但是因为 private 的原因,不能直接访问,但是可以通过反射,或者通过
super.getName();这个访问
class A { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } int a = 100; void f() { System.out.println(a); } } class B extends A { int a = 9999; public B(){ super.getName(); } void f() { System.out.println(a); System.out.println(this.a); System.out.println(super.a); } }