Java之继承、组合、代理

来源:互联网 发布:java中interrupt 编辑:程序博客网 时间:2024/04/28 01:31

Java之继承、组合、代理

一、概念理解

组合(组合是"has-a"关系):在新类中使用现有类的对象;

继承(继承是"is-a"关系):按现有类创建一个对象,不改变现有类,采用现有类的形式向其中添加新代码;(编译器强制你去初始化基类)

代理:(组合+继承)java中没有直接的支持代理,代理是组合和继承的中庸之道。(将基类对象作为代理类的成员,而代理类有对应于基类的所有方法,各方法内使用基类对象成员调用基类的方法。)

组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承则是隐式地这样做。

二、代码

public class test {public static void main(String[] args) {Demo2 d2=new Demo2();d2.print();//组合Demo1 d1=new Demo1();d1.method();//代理Demo3 d3=new Demo3();d3.stop();}}class Demo{Demo(){System.out.println("hello world!");}public static void stop(){System.out.println("Hello stop!");}}class Demo1{//组合机制public static void method(){Demo d=new Demo();//在新类中创建现有类的对象}}class Demo2 extends Demo{//继承机制,按照现有类来创建新类,无需改变现有类的形式,采用现有类的形式并且在其中添加新代码public static void print(){System.out.println("YES!");}}class Demo3{private Demo d=new Demo();public void stop(){//代理,既有继承功能 又有组合功能System.out.println("Hello 继承!");d.stop();}}


三、关于组合和继承的一些理解(引用于点击打开链接):

1)组合(has-a)关系可以显式地获得被包含类(继承中称为父类)的对象,而继承(is-a)则是隐式地获得父类的对象,被包含类和父类对应,而组合外部类和子类对应。

2)组合关系在运行期决定,而继承关系在编译期就已经决定了。

3)组合是在组合类和被包含类之间的一种松耦合关系,而继承则是父类和子类之间的一种紧耦合关系。

4)当选择使用组合关系时,在组合类中包含了外部类的对象,组合类可以调用外部类必须的方法,而使用继承关系时,父类的所有方法和变量都被子类无条件继承,子类不能选择。

5)最重要的一点,使用继承关系时,可以实现类型的回溯,即用父类变量引用子类对象,这样便可以实现多态,而组合没有这个特性。

6)还有一点需要注意,如果你确定复用另外一个类的方法永远不需要改变时,应该使用组合,因为组合只是简单地复用被包含类的接口,而继承除了复用父类的接口外,它甚至还可以覆盖这些接口,修改父类接口的默认实现,这个特性是组合所不具有的。

7)从逻辑上看,组合最主要地体现的是一种整体和部分的思想,例如在电脑类是由内存类,CPU类,硬盘类等等组成的,而继承则体现的是一种可以回溯的父子关系,子类也是父类的一个对象。

8)这两者的区别主要体现在类的抽象阶段,在分析类之间的关系时就应该确定是采用组合还是采用继承。

9)组合技术通常是用于在新类中使用现有类的功能而非它的接口的情形

(全文完)

0 0