第七章复用类

1、使用类而不破坏现有程序代码。①只需在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所以这种方法称为组合。②按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。这种方式称为继承。
7.1组合语法
1、编译器并不是简单地为每一个引用都创建默认对象。如果想要初始化这些引用,可以在下列位置进行:
①在定义对象的地方。这意味着他们总是能够在构造器被调用之前被初始化。
② 在类的构造器中。
③就在正要使用这些对象之前,这种方式称为惰性初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。
④使用实例初始化。
7.2继承语法
1、为了继承,一般的骨子额是将所有的数据成员都指定为private,将所有的方法都指定为public。
7.2.1初始化基类
1、基类构造器总会被调用,并在在导出类之前被调用。
2、如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键字super显示地编写调用基类构造器的语句,并且配以适当的参数列表。
7.3 代理
1、将一个成员对象置于所要构造的类中(就像组合),但与此同时在心累中暴露了该成员对象的所有方法(就像继承)
7.4结合使用组合和继承
1、初始化子类构造函数,则其父类构造函数也一定被初始化过。
7.4.1 确保正确清理
1、必须将清理动作置于finally子句之中,以预防异常的出现。
7.4.2名称屏蔽
1、如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽在基类中的任何版本。因此,无论是在该层或者它的基类中对方法进行定义,重载机制都可以正常工作。
7.5在组合与集成之间选择
1、组合和继承都允许在新的类中放置子对象,组合是显式地这么做,而继承则隐式地做。
2、组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但心累的用户看到的只是为新类所定义的接口,而非锁嵌入对象的接口。
7.6 protected关键字
1、实际项目中,需要将某些事物尽可能隐藏起来,但仍然允许导出类的成员访问。
2、protected:指明“就类用户而言,这是private的,但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,它却是可以访问的”
7.7 向上转型
7.7.1 为什么向上转型
1、向上转型是从一个较专用类型向较通用类型转换,所以总是很安全的。也就是说,导出类是基类的一个超集。它可能比基类含有更多的方法,但它必须至少具备基类中所含有的方法。在向上转型的过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取它们。
7.7.2再论组合与集成
1、在面向对象编程中,生成和使用程序代码最有可能采用的方法就是直接将数据和方法包装进一个类中,并使用该类的对象。
7.8final关键字
1、final的三种情况:数据,方法和类
7.8.1 final数据
1、一个永不改变的编译时常量
2、一个在运行时被初始化的值,而不希望它被改变
3、一个既是static又是final的域只占据一段不能改变的存储空间。
4、对于基本类型,final使数值恒定不变;而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身确实可以被修改的,Java并未提供使任何对象恒定不变的途径。这一限制同样适用数组,它也是对象。
5、根据惯例,既是static又是final的域将用大写表示,并使用下划线分隔各个单词。
6、定义为static强调只有一份;定义为final。说明它是一个常量。
7、空白final:Java允许生成“空白final”,所谓空白final是指被声明诶final但又未被给定初值的域。无论什么情况,编译器都确保空白final在使用前必须被初始化。必须在域的定义处或者每个构造函数中用表达式对final进行赋值,这正是final域在使用前总是被初始化的原因所在。
Final参数
7、Java允许在参数列表中以声明的方式将参数指明为final。这意味着无法在方法中更改参数引用所指向的对象
7.8.2 final方法
1、使用final方法的原因有两个:① 把方法锁定,以防任何继承类修改它的含义。想要确保在继承中使方法行为保持不变,并且不会被覆盖。②效率。
2、类中所有的private方法都隐式地指定为时final的。由于无法取用private方法,所以也就无法覆盖它。可以对private方法添加fina修饰词,但这并不能给该方法增加任何额外的意义。
3、“覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。如果某方法为private,它就不是基类的接口的一部分。它仅是一些隐藏于类中的程序代码,只不过是具有相同的名称而已。但如果在导出类中以相同的名称生成一个public\protected或包访问权限方法的话,该方法就不会产生在基类中出现的“仅具有相同名称”的情况。此时并没有覆盖该方法,仅是生成了一个新的方法。
7.8.3final类
1、当将某个类的整体定义为final时,就表明不能继承该类。对该类的设计永不需要任何变动,或者出于安全的考虑,不希望有子类。
2、Final类的域可以根据个人的意愿选择为是或者不是final。不论类是否被定义成final,相同的规则都适用于定义为final的域。然而,由于final类禁止继承。所以final类中所有的方法都隐式指定为是final的,因为无法覆盖它们。在final类中可以给方法添加final修饰词,但这不会增添任何意义。
7.8.4有关final的忠告
7.9初始化及类的加载
1、每个类的编译代码都存在于它自己的独立文件中,该文件只在需要使用程序代码时才会被加载。一般来说,可以说:“类的代码在初次使用时才加载”。这通常是指加载发生于创建类的第一个对象之时,但是当访问static域或static方法时,也会发生加载。
7.9.1继承与初始化

7.10 总结
1、继承和组合都能从现有类型生成新类型。组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。

猜你喜欢

转载自blog.csdn.net/panda_____/article/details/80261092
今日推荐