您的位置:首页 > 编程语言 > Java开发

Java编程思想之复用类

2017-07-29 12:44 225 查看
使用类而不破坏现有程序代码

两种方式:

①只需在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所以这种方法称为组合。

②按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。这种方式称为继承。

1 组合语法

只需要将对象引用置于新类中即可。

初始化引用,可以在下列位置进行:

- 在定义对象的地方,这意味着它们总是能够在构造器被调用之前被初始化。

- 在类的构造器中。

- 就在正要使用这些对象之前,这种方式称为惰性初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。

- 使用实例初始化。

2 继承语法

除非已明确指出要从其它类中继承,否则就是在隐式地从Java的标准根类Object进行继承。

①初始化基类

当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。

Java会自动在导出类的构造器中插入对基类构造器的调用。基类构造器具有执行基类初始化所需要的所有知识和能力。

构建过程是从基类“向外”扩散的,所以基类在导出类构造器可以访问它之前就已经完成了初始化。

如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键字super显式地编写调用基类构造器的语句,并且配以适当的参数列表。

3 代理

Java并没有提供对它的直接支持。这是继承与组合之间的中庸之道。

我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。

public class Proxy{
void up(int i){
System.out.println(i);
}
void down(int i){
System.out.println(i);
}
}

//使用继承
class ProExtend extends Proxy{
public static void main(String[] args){
ProExtend pe = new ProExtend();
pe.up(10);
}
}

//使用代理
class ProDelegated{
private Proxy pr = new Proxy();
public void up(int i ){
pr.up(i);
}
public void down(int i){
pr.down(i);
}
public static void main(String[] args){
ProDelegated pd = new ProDelegated();
pd.up(10);
}
}


4 final关键字

通常它指的是“这是无法改变的。”不想做改变的可能出于两种原因:设计和效率。

以下介绍了可能用到final的三种情况:数据、方法和类。

①final数据

一个永不改变的编译时常量

一个在运行时被初始化的值,而你不希望它被改变。

对于编译期常量这种情况,在Java中,这类常量必须是基本数据类型,并且以关键字final表示。在对这个常量进行定义的时候,必须进行赋值。

在对对象引用使用final时,只能使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以修改的。

一个既是static又是final的域只占据一段不能改变的存储空间。

②final方法

使用final方法的原因有二:

- 把方法锁定,以防任何继承类修改它的含义(使方法行为保持不变,并且不会被覆盖)。

- 过去建议使用fina方法的第二个原因是效率。(现在不再需要使用final方法来优化)

类中所有的private方法都隐式地指定为是final的。可以对private方法添加final修饰词,但这并不能给该方法增加任何额外的意义。

③final类

当将某个类的整体定义为final时(通过将final关键字置于它的定义之前),就表明了不允许任何人继承该类。换句话说,你对该类的设计不需要做任何变动,或者出于安全的考虑,你不希望它有子类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: