《java编程思想系列之4》 复用类

来源:互联网 发布:软件测试招聘网 编辑:程序博客网 时间:2024/05/23 21:40
一、组合语法

编译器并不是简单的为每一个引用都创建默认对象,这一点是很有意义的,因为若真的那样做的话,就会在许多情况下增加不必要的负担。如果想要初始化这些引用,可以在代码的下列位置进行:
(1)在定义对象的地方。这意味着它们总能在构造器调用之前完成初始化
(2)在类的构造器中
(3)就在正要使用这些对象之前,这种方式成为惰性初始化。在声称对象不值得或者不必要每次都生成对象的情况下,这种方式可以减少额外的负担
(4)使用实例初始化

二、继承语法
1、初始化基类

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

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

所有的基类在导出类的构造器可以访问它之前,就已经完成了初始化:
基类构造器:(a)总是会被调用 (b)在导出类的构造器之前被调用

2、带参数的构造器

(1)如果没有默认的基类构造器,或者想用一个带参数的基类构造器,就必须用关键字super显式的编写调用基类构造器的语句,并且配以适当的参数列表。
(2)调用基类的构造器必须是你在导出类构造器中要做的第一件事。

三、代理




(1)将一个对象置于索要构造的类中(类似组合)
(2)在新类中暴露了该成员对象的所有方法(类似继承)

四、结合使用组合和继承

1、确保正确清理
2、名称屏蔽

(1)如果java的基类拥有某个已经多次被重载的方法名称,那么在导出类中重新定义该方法名称不会屏蔽在基类中的任何版本(这一点和c++不同)
(2)java SE5新增加了@Override注解,它不是关键字,但是可以把它当做关键字使用。当想要覆写某个方法时候,可以选择添加该注解,当你不留心重载而非覆写了该方法的时候,编译器就好生成一条错误消息:

五、在组合与继承之间选择
(1) “is-a”--->继承
(2) “has-a”---->组合

六、protected关键字

七、向上转型

八、final关键字

1、final数据

1)一个永不改变的编译时常量
2)一个在运行时被初始化的值,而你不希望它改变

对于基本类型,final使数组恒定不变,而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的。

我们不能因为某数据是final的就认为编译时就可以知道它的值。

(1)空白final
java允许生成“空白final”,所谓空白final是指被声明为final但又未给定初值的域。无论什么情况,编译器都确保空白final在使用前必须被初始化。

(2) final参数

java允许在参数列表中以声明的方式将参数指明为final。这意味着你无法再方法中更改参数引用所指向的对象。(这一特性主要用来向匿名内部类传递数据)

2、final方法

使用final方法的原因有两个:
1)把方法锁定,以防止任何继承类修改它的含义
2)效率

(1)final和private关键字

类中所有的private方法都隐式的指定为final的。由于无法取得private方法,所以也就无法覆盖它。

“覆盖”只有在某方法是基类的接口的一部分时候才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。如果某方法为private,它就不是基类的接口的一部分。它仅是一些隐藏于类中的程序代码,只不过是具有相同的名称而已。

3、final类

1)当将某个类的整体定义为final的时候,就表明了你不打算继承该类,二期也不允许别人这么做。
2)由于final类禁止继承,所以final类中所有的方法都会隐式指定为final的,因为无法覆盖它们。在final类中科院给方法添加final修饰词,蛋这不会增添任何意义。

九、初始化及类加载

一般来说,类的代码在初次使用时候才加载。这通常是指加载发生于创建类的第一个对象之时,但是当访问static域或static方法的时候,也会发生加载。

构造器也是static方法,尽管static关键字没有显式的写出来。更准确的讲,类是在任何static成员被访问的时候被加载的。


0 0
原创粉丝点击