Java 子类调用父类方法修改父类属性

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;

5c90a06ee2794d1280d4358eff806fc4.png

第7行,s.test() 改变的并不父类的f.info,改变的是子类从父类中继承的s.Father.info="大硅谷",此时父类中info不变,f.info = "atguigu";结果如图:

第9行,s调用父类的setInfo()方法,所以得到的是子类中继承得到的父类属性s.Father.Info="大硅谷",

50f3b8635efa44438037a551a8ea836b.png

第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 = 大硅谷
    }
}

总结:

  1. 子类会继承父类所有属性,此时子类有2个属性:子类自己的属性s.Info & 从父类继承的属性s.Father.Info

  2. 只有对父类f调用方法,f.getInfo(),只对父类属性f.Info操作
  3. 子类自身没有get方法,子类通过调用父类的方法,则只对子类中继承来的父类属性s.Father.Info操作,不会对父类原本的属性有任何操作,也不会对自身产生的属性有操作
  4. 子类自身有get方法,则对子类自身的属性s.Info进行操作

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值