今天在看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方法,子类都会继承
是子类的对象所以要用子类的方法
自己的理解,如果有误,请大神指教,不胜感激。