利用旧代码实现功能的拓展,如果只是复制黏贴就显得笨拙,更优雅的方式是组合和继承。 组合,顾名思义,即是在新的类中产生现有类的对象,也就是新的类由现有类组成,显得非常直观。 而继承则是按照现有类来创建新类,采用现有类的形式并在其中添加新代码。
组合语法
这种方法很常见也很直观,只需把对象引用放进新类中即可。例如
public class A{
private String str1,str2;
private B b = new B();
private int i;
}
这里要注意,初始化时基本类型可以被初始化为零,但是对象引用会被初始化为null,想要初始化引用,一般有下列几种方法:
- 在定义的地方初始化
- 在构造器中初始化
- 在使用之前,即惰性初始化
- 实例初始化
下面是几种方法的示例:
public class A{ private A a; private B b; private C c; { a = new A(); //实例初始化 } public A(){ b = new B(); //在构造器 } public String fun(){ String str = "abc"; //在定义的地方 } public static void main(String[] args){ c = new C(); System.out.println(c); //惰性初始化 } }
继承语法
使用继承时,需要使用关键字 extends + 原有类名 声明新类和原有类的关系。继承时,子类会自动获得基类中所有域和方法。 另外,如果子类想调用基类方法,一般会使用super关键字,super.fun()表示调用基类的fun()方法。 初始化基类:当初始化一个子类时,java会在子类的构造器中插入对基类构造器的调用,如果没有编译器会自动合成一个默认的构造器。当有多层继承关系时,会往上追溯到第一层然后向下依次初始化。
代理
代理是一种位于继承和组合之间的关系,**它将一个成员对象置于要构造的类中(类似组合),但同时在新类中暴露该成员对象的所有方法(类似继承)。它和设计模式中的代理模式关系密切。
选择
组合通常适用于在新类中使用现有类的功能而非它的接口的情形,是一种“has-a”的关系; 继承是使用某个现有类,并开发出一个它的特殊版本,是“is-a”的关系。
final关键字
数据
对于基本类型的数据,它无法改变;对于对象的引用也不能改变,但是所指的对象能够改变(数组同理)。 另外必须在域定义处或构造器中对final数据赋值。
方法
用final修饰方法有两个好处,第一是能够锁定方法,防止继承类修改,第二是能提高运行效率,但这个在高版本JDK中已经进行了优化,应尽量避免这样使用。
类
防止继承。