单根继承的好处
2016-07-21 22:54
295 查看
最近在学习《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);
}
}
输出:
所以达到的好处就是我在写程序时参数指名用的是父类的名字,后面我无论传哪个子类进来,都能处理,并且只要稍加转换,就能利用到子类的特有方法。
先引用下书本上的原文解释对单根继承的阐述:
书上的解释比较笼统,所以自己网搜了下,最后去到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);
}
}
输出:
所以达到的好处就是我在写程序时参数指名用的是父类的名字,后面我无论传哪个子类进来,都能处理,并且只要稍加转换,就能利用到子类的特有方法。
相关文章推荐
- Java 八大基本数据类型以及包装类的详解
- Java并发总结(一): 线程的介绍及创建
- 2016.7.20晚 听课收获
- Android中.this的意思
- 【Get深一度】dB、dBm、dBW和W换分别代表的含义及换算关系
- Retrofit 2.0 超能实践(四),完成大文件断点下载
- ubuntu 14.04更新源
- Retrofit 2.0 超能实践(四),完成大文件断点下载
- L1-019. 谁先倒-PAT团体程序设计天梯赛GPLT
- static关键字
- UVA 11988 链表
- 《代码大全》中推荐的一些程序员和软件工程师需要读的书籍
- 怎样提高网站用户体验
- 怎样提高网站用户体验
- workday3~4
- iOS开发小技巧--即时通讯项目:使用富文本在UILabel中显示图片和文字;使用富文本占位显示图片
- 前端设计模式责任链模式
- Objective-C & Sprite Kit太空历险记 : 2. 初级训练营——Objective-C基础(上)
- Nagios-安装与配置
- 广播