复用类
复用代码是java众多引人注目的功能之一,但要想成为极具革命性的语言,仅仅能够赋值代码并对之加以改变是不够的,它还必须能够做更多的事情。
一、组合语法
只需将对象一用置于新类中 -- 组合技术的使用。对于非基本类型的对象,必须将其引用置于新的类中。
编译器并不是简单的为每一个引用都创建默认对象,因为在很多情况下会增加不必要的负担。如果想初始化这些引用,可以在代码中的下列位置进行:
1,在定义对象的地方。这意味着它们总是能够在构造器被调用之前被初始化。2,在类的构造器中。3,就在正要使用这些对象前,这种方式被称为惰性初始化,在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。4,使用实例初始化。
二、继承语法
继承是所有OOP语言和java语言不可缺少的组成部分。当创建一个类时,总是在继承,因此,除非已明确指出要从其它类中继承,否则就是在隐式地从 java的标准根类Object进行继承。
java用super关键字表示超类的意思,当前类是从超类继承而来,避免直接调用父类方法会产生的递归现象。
基类和导出类的区别在于:导出类来自于外部,而基类的子对象被包装在导出类对象内部。
对基类子对象的正确初始化至关重要,且仅有一种方法保证这一点:在构造器中调用基类构造器来执行初始化,而基类构造器具有执行基类初始化所需要的所有知识和能力。
带参构造器必须用关键字super显示编写调用基类构造器的语句。
三、代理
java并没有提供对它的直接支持,这是继承与组合之间的中庸之道,因为我们讲一个成员对象置于所要构造的类中(就像组合),但与此同时,我们在新类中暴露了该成员对象的所有方法(就像继承)。
四、结合使用组合和继承
同时使用组合和继承是很常见的事。虽然编译器强制你去初始化基类,并且要求你要在构造器起始处就这么做,但是它并不监督你必须将成员对象也初始化。
java中没有C++中析构函数的概念。析构函数是一种在对象被销毁时可以被自动调用的函数。显式的清理一些东西,必须将这一清理动作置于finally字句中,以预防异常的出现。
如果java的基类拥有某个已经被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。
override代表覆写某个方法,它并不是关键字,但可以当做关键字使用。
五、在组合与继承之间选择
组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承是隐式的做。
组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口。
在继承的时候,使用某个现有的类,并开发一个它的特殊版本,通常,这意味着你在使用一个通用类,并为了额某种特殊需要而将其特殊化。
六、protected关键字
关键字protected指明就类用户而言,这是private的,但对于任务号继承于此类的导出类或其他任何位于同一个包内的类来说,它却是可以访问的。
尽管可以创建protected域,但是最好的方式还是将域保持为private,你应当一直保留更改底层的权利,然后通过protected的方法来控制类的继承者的访问权限。
七、向上转型
“为新的类提供方法”并不是继承技术中最重要的方面,其最重要的方面是用来表现新类和基类之间的关系。这种关系可以用“新类是现有类的一种类型”这句话加以概括。
由导出类转型成基类,在继承图上是向上移动,因此一般称为向上转型。由于向上转型是从一个较专用类型向较通用类型转换,所以总是安全的。也就是说,导出类是基类的一个超集。它可能比基类含有更多的方法,但它必须至少具备基类中所含有的方法,在向上转型的过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取它们。
是否需要向上转型是判断你采取组合与继承的最具说服力的理由。
八、final关键字
java关键字final的含义通常它指的是:“这是无法改变的”。不做改变的可能出于两种理由:设计或效率
final数据:1,一个永不改变的编译时常量。2,一个在运行时被初始化的值,而你不希望它被改变。在java中,这类常量必须是基本数据类型,并且以关键字final表示。
在对这个常量进行定义的时候,必须对其进行赋值。一个既是static又是final的域只占据一段不能改变的存储空间。
final方法:1,锁定方法,以防止任何继承类修改它的含义。2,效率。
类中所有的private方法都隐式地制定为是final的,由于无法取用private方法,所以就无法覆盖它。
final类:表明你不打算继承该类,并且不允许别人这样做。出于某种考虑,对该类的设计永不需要做任何变动,或者出于安全的考虑,你不希望它有子类。
九、初始化及类的加载
java中所有的事物都是对象,每个类的编译代码都存在于它自己的独立文件中,该文件只在需要使用程序代码时才会被加载。可以说“类的代码在初次使用时才加载”,但是当访问static域或static方法时,也会发生加载,初次使用之处也是static初始化发生之处,定义为static的东西只会被初始化一次。
继承与初始化:类加载器从入口main或者其它开始进行加载,遇到什么类就加载什么类,向上找基类,向下找导出类等等,加载完毕后,创建对象。然后基本类型被设为默认值,引用对象被设定为null,然后类的构造器被自动调用,构造器完成后,实例变量按次序被初始化,最后,构造器的其余部分被执行。
十、总结
继承和组合都能从现有类型生成新类型。组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。
使用继承时,由于导出类具有基类接口,因此它可以向上转型至基类,这对多态来讲至关重要。
程序开发是一个增量过程,将项目视作一种有机的,进化着的生命体而去培养,会获得更多的成功和更迅速的回馈。继承和组合正是在面向对象程序设计中使得你可以执行这种实现的最基本的两个工具