java 的子类化 是什么?

今天看到Effective Java书中提到了一个子类化的概念,网上查了下说是什么
组合不是继承。还是有些不太明白,按照这个说法,子类化是不是可以理解为
那个装饰者模式呢?装饰者模式不也是组合扩展吗?请知道的大神,告诉下这样理解对吗? 谢谢了。

//这是一个父类Demo
public class SunDemo {
//私有的构造器
private SunDemo(){
}
//通过静态工厂方法得到对象
public static SunDemo value(){
    return new SunDemo();
}
//父类的方法
public void say(){
    System.out.println("SunDemo say()");
}

}
 //子类Demo

 public class Demo extends SunDemo{

}

error:Implicit super constructor SunDemo() is not visible for default constructor. Must define an explicit constructor

说明SunDemo没有公共的构造器,它不允许被继承。就是说你的类使用了静态工厂方法提供对象的实例化,没有提供public的构造器,那么这个类就不允许被继承。我们如果想要在Demo类中使用SunDemo的方法就得使用复合。

public class Demo {

SunDemo d = null;

@Test
public void DemoTest(){

    d=SunDemo.value();
    d.say();
}

}


主要目的为了更加方便的重用,通常不需要符合Is-a的要求,如果采用组合,那么必须手写大量接口,然后Delegate给这个成员变量,如果父类很大的话,使用组合需要大量的工作量,而采用继承则方便很多,另外通过继承可以访问protected的成员及其方法,这也是组合所不具备的。

子类化可以分为实例子类化和全局子类化。实例子类化就是修改窗口实例的窗口过程地址,全局子类化就是修改窗口类的窗口过程地址。实例子类化只影响被修改的窗口。全局子类化会影响在修改之后,按照该窗口类创建的所有窗口。显然,全局子类化不会影响修改前已经创建的窗口。

子类化方法虽然是二十年前的概念,却很好地实践了面向对象技术的开闭原则(OCP:The Open-Closed Principle):对扩展开放,对修改关闭。