关于java继承的一些理解错误

今天在看wifi源码的时候,发现一个自己在java 继承方面知识理解的一些缺陷。在这儿记录一下。
先上代码吧:

这是父类:

public class Father {
    public String  getName(){
        Log.d("cxxp","Father getName()");
        return getTrueName();
    }

    public String getTrueName(){
        Log.d("cxxp","Father getTrueName()");
        return null;
    }

    public String getResult(){
        Log.d("cxxp","Father getResult()");
       return getName();
    }
}

这是子类1

public class Son1 extends Father{
    @Override
    public String getName() {
        Log.d("cxxp","Son1 getName()");
        return "son1";
    }

    @Override
    public String getTrueName() {
        Log.d("cxxp","Son1 getTrueName()");
        return "son1 is true name";
    }

    public String getMyResult(){
        Log.d("cxxp","Son1 getMyResult()");
        return getResult();
    }
}

这是子类2

public class Son2 extends Father{
    @Override
    public String getName() {
        Log.d("cxxp","Son2 getName()");
        return "son2";
    }

    @Override
    public String getTrueName() {
        Log.d("cxxp","Son2 getTrueName()");
        return "son1 is true name";
    }

    public String getMyResult(){
        Log.d("cxxp","Son2 getMyResult()");
        return getResult();
    }
}

这是调用

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bt_son1_getresult:
                Son1 s1 = new Son1();
                tv.setText(s1.getMyResult());
                break;
            case R.id.bt_son2_getresult:
                Son2 s2 = new Son2();
                tv.setText(s2.getMyResult());
                break;
            case R.id.bt_father_getresult:
                Father father = new Father();
                tv.setText(father.getResult());
                break;
        }
    }

这是 log

//case R.id.bt_son1_getresult:子类1调用 没有重写的方法 getMyResult()
10-30 08:41:16.634 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son1 getMyResult()
10-30 08:41:16.634 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getResult()
10-30 08:41:16.634 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son1 getName()
case R.id.bt_son2_getresult:子类2调用 没有重写的方法 getMyResult()
10-30 08:41:20.735 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son2 getMyResult()
10-30 08:41:20.735 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getResult()
10-30 08:41:20.735 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Son2 getName()
case R.id.bt_father_getresult:父类调用 getResult() 方法
10-30 08:41:23.652 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getResult()
10-30 08:41:23.652 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getName()
10-30 08:41:23.652 2535-2535/com.cxp.dyzc.stringdemo D/cxxp: Father getTrueName()

为了便于理解这个场景,再附上一张图:

这里写图片描述

怎么去理解最终打出的log?

把子类的方法当做子类加上父类的方法即可
子类可以调用父类的方法,但是父类在没有子类对象的情况下无法调用子类的方法。
父类的public方法,子类都会继承
是子类的对象所以要用子类的方法

自己的理解,如果有误,请大神指教,不胜感激。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值