java之继承与组合

1.Question:有没有听说过组合优于继承这样的说法?如果有听说过,那么你是怎么理解的?

继承是一种多态工具,而不是一种代码复用工具。有些开发者喜欢用继承的方式来实现代码复用,即使在没有多态的情况下。

在什么时候使用继承呢?只能在类之间有“父子”关系的情况下使用

a.不要仅仅为了代码的复用而继承。当你使用组合来实现代码的复用时,是不会产生继承关系的。过度使用继承的话,如果修改了父类,会损坏所有的子类。这是因为子类和父类的紧耦合关系是在编译期产生的。

b.不要仅仅为了多态而继承。如果你的类间没有继承关系,并且你想要实现多态,那么你可以通过接口和组合的方式来实现,这样不仅可以实现代码的重用,同时也可以实现运行时的灵活性。

c.继承——发生在编译时,因为它是静态的

   代理或是组合——发生在运行时,因为它更具有动态性和灵活性,类可以在运行时多态地根据一个结果有条件或者是无条件地进行组合。但是继承却是静态的。

2.你能通过实例来区别编译期继承还是运行时继承,以及Java支持哪种吗?

继承表示动作和属性从一个对象传递到另一个对象的场景。Java语言本身只支持编译期继承,它是通过“extends”关键字来产生子类的方式实现的。

public class Parent {
	public String saySomething(){
		return "Parent is called";
	}
}
public class Child extends Parent{
	@Override
	public String saySomething() {
		// TODO Auto-generated method stub
		return super.saySomething()+",Child is called";
	}
	public static void main(String[] args){
		Parent p = new Child();
		System.out.println(p.saySomething());
	}
}
“Child”类的saySomething()方法的调用会返回“Parent is called,Child is Called”,因为子类的调用继承了父类的“Parent is called”,关键字“super”是用来调用“Parent”的方法的。

运行时继承表示在运行时构建父/子类关系。Java语言本身不支持运行时继承,但是有一种替代的方案叫做“代理”或者是“组合”。这样就可以模拟运行时继承的实现。

组合的实现:

子类代理了父类的调用!

public class Child{
	//创建一个父类的实例,通过这个实例来调用父类中的方法
	private Parent p = null;
	public Child(){
		this.p = new Parent();
	}
	public String saySomething(){
		return this.p.saySomething()+",Child is called";
	} 
	public static void main(String[] args){
		System.out.println(new Child().saySomething());
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值