Java编程思想之复用类

使用类而不破坏现有程序代码
两种方式:
①只需在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所以这种方法称为组合。
②按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。这种方式称为继承。


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关键字置于它的定义之前),就表明了不允许任何人继承该类。换句话说,你对该类的设计不需要做任何变动,或者出于安全的考虑,你不希望它有子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值