继承的条件是:子类中有增加成员的属性,或修改了父类的方法,或有自己的方法。
组合的条件是:处于类复用的目的
下面先来看一个继承的demo
class Animal
{
private void beat()
{
System.out.println("心脏跳动");
}
public void breath()
{
System.out.println("吸一口气,吐一口气,呼吸中...");
}
}
//继承Animal,直接复用父类的breath方法
class Bird extends Animal
{
public void fly()
{
System.out.println("我在天空自在的飞翔...");
}
}
//继承Animal,直接复用父类的breath方法
class Wolf extends Animal
{
public void run()
{
System.out.println("我在陆地上快速奔跑...");
}
}
public class InheritTest
{
public static void main(String[] args)
{
Bird b = new Bird();
b.breath();
b.fly();
Wolf w = new Wolf();
w.breath();
w.run();
}
}
**********************************************************************************************************************************
然后是 组合 的 demo
class Animal
{
private void beat()
{
System.out.println("心脏跳动");
}
public void breath()
{
this.beat();
System.out.println("吸一口气,吐一口气,呼吸中...");
}
}
class Bird
{
//将原来的父类嵌入原来的子类,作为子类的一个组合成分
private Animal a;
public Bird(Animal a)//这里其实一个构造器 创建对象之前 将创建好的Animal对象传入 然后将Animal对象的引用付给了当前对象
{
this.a = a;
}
//重新定义一个breath方法
public void breath()
{
//直接复用Animal提供的breath方法来实现Bird的breath方法
a.breath();
}
public void fly()
{
System.out.println("我在天空自由自在的飞翔");
}
}
class Wolf
{
//将原来的父类嵌入原来的子类,作为子类的一个组合成分
private Animal a;
public Wolf(Animal a)//这里其实一个构造器 创建对象之前 将创建好的Animal对象传入 然后将Animal对象的引用付给了当前对象
{
this.a = a;
}
//重新定义一个自己的breath方法
public void breath()
{
//直接复用Animal提供的breath方法来实现Wolf的breath方法
a.breath();
}
public void run()
{
System.out.println("我在陆地上快速奔跑");
}
}
public class CompositeTest
{
public static void main(String[] args)
{
//此时需要显式创建被嵌入的对象
Animal a1 = new Animal();
Bird b = new Bird(a1);
b.breath();
b.fly();
//此时需要显式创建被嵌入的对象
Animal a2 = new Animal();
Wolf w = new Wolf(a2);
w.breath();
w.run();
}
}
组合是把旧类对象作为新类的Field嵌入,用以实现新类的功能,用户看到的是新类的方法,而不能看到被嵌入对象的方法。因此,通常需要在新类里使用private修饰被嵌入的旧类对象。
总之,继承要表达的是一种“是 is-a”的关系,而组合表达的是“有has-a”的关系