Java编程思想 第七章读书笔记

来源:互联网 发布:为什么ipad打不开软件 编辑:程序博客网 时间:2024/06/13 16:32

复用类 思考Java是如何复用代码,然后通过复用代码来实现更加复杂的逻辑的。

1.组合语法 也就是在新定义的类中引入已经创建类的对象

2.继承语法 创建一个类的时候总是在继承,显示的通过extend 一个已有类,或者是隐式的继承自Object类。继承是衍生类完全继承了父类的域和所有的接口(public方法)。希望不要误会继承就是把父类的接口方法和域复制到衍生类中。继承和复制不同,我们在创建一个子类对象时,会先创造一个父类对象(先有父亲再有的儿子嘛),我喜欢把它理解为隐形的创建了一个父类对象,而且子类拥有父类对象的引用。那如何初始化父类对象呢,为了初始化父类对象,需要我们在子类的构造方法中调用父类的构造方法,这样就可以实现父类的初始化。如果父类的构造法是无参构造方法,那么我们可以省略代码去调用父类的构造方法(编译器会帮我们调用)。如果父类没有无参数的构造方法,那么子类必须显示的通过super.调用父类的构造方法。

3.代理 介于组合和继承之间。例如我创建了一个类Cat  有一个方法eat()   代理的实现方式是在新类中创建一个 Cat对象,然后实现一个方法 eat(){  cat.eat(); } 通过把Cat的接口都定义一遍然后通过引用cat对象去实现这些接口。代理看上去的效果就是拥有和Cat一样的接口但是它不是一个Cat。而是通过传递,让真正实现了接口方法。代理相对于继承的好处是,更加灵活,更多的控制力,因为我们可以选择只提供在成员对象的方法的某个子集。

4.组合和继承  是我们常用的方法,不过我们需要堆个别情况保持清醒。我们在处理对象必要的清理时会写一个清理方法,然而我们继承一个类的时候要注意调用父类清理顺序和构造方法的调用顺序相反,我们要先调用子类的清理方法,再调用父类的清理方法以防子类调用某个方法或者某个参数时异常。

关于重写,如果基类某个方法已经被重写很多遍了,那么在导出类重新定义该名字的方法,不会屏蔽其在基类的任何版本的方法。通俗点说,假如说父类有了两个名字一样的方法(参数列表不同),我在子类中又重写了一个(参数列表不同于父类的两个),我相当于子类当中有三个名字相同的方法,它不会覆盖或者隐藏父类的方法。

5.在组合和继承之间选择   。组合和继承对于实现复杂的类方式有什么不同有什么相同?我们通过组合和通过继承实际上都是放置了子对象,组合是显示的描述了我们放置的子对象,继承是隐式的描述。我们使用组合的大部分时候是为了把它当作工具,而我们本身并不需要这个工具的接口,我们只有自己定义的接口。在使用组合的时候我们也需要考虑,是否要将子类对象设置为public或者是private。public 有助于客户端程序员了解怎么样去使用一个类,降低类开发者的代码复杂程度。继承使用了一个先有类,然后通过继承实现了这个类的特殊版本,

6.protected关键字  :对外界是private 对于自己和继承类来说是public 

7.向上转型 表达衍生类和基类的关系,向上转型是is-a的具体表现。向上转型是安全的,因为它包含了父类所有接口(向上转型就是剔除掉出了基类接口以外的接口)。我们在考虑是否需要使用继承的时候,可以通过思考是否需要向上转型来回答自己。

8.final 关键字 通常表达无法改变的,不想改变出于两个方面考虑:设计或效率。

final数据:告诉编译器一块数据是恒定不变的。常常用作:一个永远不变的编译时常量;一个运行时被初始化,而且不希望它改变。对于编译时常量,编译器可以将常量值带入任何需要使用到它的计算当中,在执行计算时减少一些负担。final修饰的对象引用是为了,当引用被初始化指向一个对象,就无法指向另一个对象了。对象本书的变量是可以修改的。final表达的数据是不变,static修饰的数据表达是独立于对象。这里要注意梳理static变量和final变量的初始化时间,static是类第一次创建对象或者是第一次通过类名使用static属性的时候初始化。而final 修饰的对象可以在运行时初始化。java 允许空final 是指一个成员变量被final修饰但是又没有指向一个对象,编译器会确保final修饰的成员变量在使用前被初始化,这样会更加灵活,为此一个类中的final成员变量就可以做到根据对象不同而有所不同,却又保持不变的特性。

final参数 Java允许在参数列表中将参数明确为final,这样意味着无法在方法中修改参数所指引的对象。

final方法 原因:把方法锁定,以防继承类修改它的含义,确保在继承中保持不变;效率,一个方法为final,意味着同意编译器将针对该方法的调用都转为内嵌调用。当编译器发现一个final方法时调用命令时,它会根据自己的谨慎判断,跳过插入代码这种正常方式,而直接执行方法调用机制,并以方法实体中的实际代码的副本代替方法调用。这将消除方法调用的开销。如果一个方法很大,你的程序代码就会膨胀,因而可能看不到内嵌带来的任何性能提高,因为所带来的性能会因为花费在方法内的时间量而被缩减。

final类 表明这个类不允许被继承,

9.初始化及类的加载    类是什么时候加载的?因为一切都是对象,每个类的编译代码存在于每个类的独立文件中,该文件只有在需要的时候才会被加载

在执行一个Java文件的main方法时,加载器会找到该类的编译代码。在加载该类过程中,发现它有父类,就会去加载父类,根基类的static方法初始化,然后是下一层类的static属性初始化,最后是导出类。因为static初始化有可能依赖于基类的成员是否已经初始化。




0 0