public class Interview02{
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo());//atguigu
System.out.println(s.getInfo()); //atguigu
s.test();//atguigu atguigu
System.out.println("-----------------");
s.setInfo("大硅谷");
System.out.println(f.getInfo());//atguigu
System.out.println(s.getInfo());//大硅谷
s.test(); //大硅谷 大硅谷
}
}
class Father{
private String info = "atguigu";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
class Son extends Father{
private String info = "尚硅谷";
public void test(){
System.out.println(this.getInfo());
System.out.println(super.getInfo());
}
// public String getInfo(){
// return info;
// }
}
P97 Super课后练习,interview,这里逐行debug一下就清楚了,
实际上是s有两个属性,一个本身的info,一个从父类继承的Father.info;
第7行,s.test() 改变的并不父类的f.info,改变的是子类从父类中继承的s.Father.info="大硅谷",此时父类中info不变,f.info = "atguigu";结果如图:
第9行,s调用父类的setInfo()方法,所以得到的是子类中继承得到的父类属性s.Father.Info="大硅谷",
第10行,t.test() 同理,由于子类没有自己的getInfo()方法,无论是this.getInfo(),还是super.getInfo(),本质上都只调用的父类的方法,所以相应的得到子类中对应父类属性s.Father.Info="大硅谷".
同理可以测试得到如果子类中有自己的getInfo()方法:
(其他代码一致,此处省略)
class Son extends Father{
public String info = "尚硅谷";
// 在子类中加入getInfo()方法,无需再从父类调用
public String getInfo(){ return info; }
public void test(){
System.out.println(this.getInfo());
System.out.println(super.getInfo());
}
}
运行结果见注释:
public class Interview02{
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo()); // atguigu
System.out.println(s.getInfo()); // 尚硅谷
s.test(); // s.Info = 尚硅谷 s.Father.Info = atguigu
System.out.println("-----------------");
s.setInfo("大硅谷");
System.out.println(f.getInfo()); // atgugu
System.out.println(s.getInfo()); // 尚硅谷
s.test(); // s.Info = 尚硅谷 s.Father.Info = 大硅谷
}
}
总结:
子类会继承父类所有属性,此时子类有2个属性:子类自己的属性s.Info & 从父类继承的属性s.Father.Info
- 只有对父类f调用方法,f.getInfo(),只对父类属性f.Info操作
- 子类自身没有get方法,子类通过调用父类的方法,则只对子类中继承来的父类属性s.Father.Info操作,不会对父类原本的属性有任何操作,也不会对自身产生的属性有操作
- 子类自身有get方法,则对子类自身的属性s.Info进行操作