最近在学习《Thinking in java》一书,在书中作者提到了单根继承的好处(对比java和C++)。
先引用下书本上的原文解释对单根继承的阐述:
书上的解释比较笼统,所以自己网搜了下,最后去到stack overflow找到个还比较好比较完整的答案。较详细的说明了部分好处:
我把它用自己的话来重新阐述一遍:
1:参数传递,因为往往写函数时不明确要传入的类是怎样的,所以可以这样:
public void function(Object obj)
也就是在参数传入的是一个父类,就不用说在编写函数时非得明确传入的是哪个子类了。因为传入的是父类,所以如果想要使用子类的方法,那么就需要时用到强制类型转换,将父类转化为子类。下面有我写的一个示例。
2:每个类都具有了基础的功能,也就是object类的那些功能,比如 ToString() , GetType()。这点很容易理解,有个回答者还说到,你可以去extend Object类的功能,那其他所有类都具有更强大的基础功能。
3:方便垃圾回收机制的实现,其实就是方便找到垃圾所在的位置,从根类object开始一层层往下找。这个特点偏向于语言开发者~
4:方便异常处理,写异常函数的时候并不知道要抛的是哪个子类的异常,如果写明了是抛哪个子类的异常,那别的子类就用不了这个异常函数了,跟参数传递差不多的道理,所以直接抛一个父类的异常……这个可能描述得有差错,尚待讨论。
5:其实说到底,语言这样设计的目的无他,就是为了代码复用或者方便写代码或者带来更好的程序执行效率。

附一个上面说到的在参数传递优点的小示例程序:
1.父类Dad.java:
/ * Dad class,Test for inheritance */ package hello; / * @author lv.lang * */ public class Dad { private String name; private int ate; / * */ public Dad() { // TODO Auto-generated constructor stub this.name = "LvLang"; this.ate = 36; } public Dad(String name,int ate) { this.name = name; this.ate = ate; } public void Talk() { System.out.println("I can talk."); } public int TellMeYourAte() { return this.ate; } public String TellMeYourName() { return this.name; } }
讯享网
2.子类Son.java
讯享网/ * Son class,Test for inheritance */ package hello; / * @author lv.lang * */ public class Son extends Dad{ private double salary; public Son() { this.salary = 10000; } public Son(double salary) { this.salary = salary; } @Override public void Talk() { System.out.println("I am Son, and I can talk loudly!"); } public double TellMeYourSalary() { return this.salary; } }
3.main文件main.java:
/ * This is main file. */ package hello; / * @author lv.lang * */ public class Main { public static void Say(Dad in) { //强制类型转换将传入的对象转为Son类型从而下面才能使用子类特有的方法 /*方法一:新开一个子类对象然后用=赋值*/ Son input = (Son)in; //这句相当于Son input = new Son(); input = (Son)in; double salary = input.TellMeYourSalary(); /*方法二:直接转换后立即调用子类方法,注意括号的使用*/ //double salary = ((Son)in).TellMeYourSalary(); System.out.println(salary); } / * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Dad dad = new Dad(); Son son = new Son(2000); dad.Talk(); System.out.printf("My name is %s.\n", dad.TellMeYourName()); son.Talk(); Say(son); } }
输出:

所以达到的好处就是我在写程序时参数指名用的是父类的名字,后面我无论传哪个子类进来,都能处理,并且只要稍加转换,就能利用到子类的特有方法。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/130161.html