教程把is-A和Has-A放在一起,我还以为java支持简单的方法能把Has对象的方法导出呢。。
extents implements
要试一下。
不知道狗和汽车为什么总是被选出来举例。
package Language; /** * * 面向对象接口 * @author y */ public interface IFace2Object { String getClassKey(); Boolean AllowMutilInhert(); }
package Language; /** * * 开发语言基类 * @author y */ public abstract class ProgramLanguage { public abstract String getMyType(); }
package Language; /** * * C语言 * @author y */ public class PL_C extends ProgramLanguage { @Override public String getMyType() { return "C"; } }
package Language; /** * * @author y */ public class PL_Cpp extends ProgramLanguage implements IFace2Object { @Override public String getMyType() { return "C++"; } @Override public String getClassKey() { return "class"; } @Override public Boolean AllowMutilInhert() { return true; } }
public class PL_Java extends ProgramLanguage implements IFace2Object { @Override public String getMyType() { return "Java"; } @Override public String getClassKey() { return "class"; } @Override public Boolean AllowMutilInhert() { return false; } }
练练写法就行了,就不写测试代码了,没必要。
@Override不知道做什么用的,先看吧。难道是类似 c++11的override关键字?
Java的方法重写,不必在父类中声明,反而是只有final的方法不能被重写。
Super可以直接调用父类方法,而不必要知道父类名。这很有用。更改父类不必要搜索父类名,在C++中则很烦。
不过c++ 可以typedef BaseClassName BaseClass,来简化。
函数的重载没什么说的,我只好奇,子类重载父类中的函数时, 调用子类的父类函数接口,能否正常调用。C++是不行的,看你的了,java。
package Language; /** * * @author y */ public class PL_Cpp extends PL_C implements IFace2Object { public String getMyType(Boolean bCpp){ return bCpp ? "C++" : "C"; } @Override public String getClassKey() { return "class"; } @Override public Boolean AllowMutilInhert() { return true; } public static void main(String[] args){ PL_Cpp tp = new PL_Cpp(); String sType = tp.getMyType(); System.out.println("Cpp Default Type = " + sType); } }
输出:
run:
Cpp Default Type = C
成功构建 (总时间: 0 秒)
可以调用哦。
在C++中,对父类非虚函数的重载叫重写,JAVA似乎不这么叫。
JAVA中纯虚函数不能实现。
接口的继承也用extends