本节内容是对《Thinking in Java》中第七章 复用类的笔记和总结
1 , 复用现有的代码而不去破坏现有的代码,有两种方法:组合和继承。
2,toString()方法。在类需要转变成String对象的时候,就会调用该函数。例如有个A类的对象a , A a ;然后有语句 ”object:“+a;这时候其实是"object:"+a.toString();
3,惰性初始化。成员的初始化有很多种,我们在之前的学习中知道,如果是基本数据类型没有初始化,则会被初始化一个默认的纸,例如int的会被初始化为0;而如果是对象引用,则会被初始化为null。在定义处的初始化要比构造函数的初始化还要早,但它只能实现千遍一律的初始化。静态成员的初始化是在类加载的时候就初始化了,这个更早。对初始化代码还可以用花括号独立起来,这个和在定义处初始化是一个效果。而惰性初始化是”在你要用到该成员的时候,初始化,然后再使用“。这种延缓的初始化往往可以减少负担。因为需要才初始化嘛。
4,Java中类的继承是通过extends来实现的,继承后的派生类拥有基类的所有成员和方法。
5,每个类都可以配备一个public static void main(String[] args)方法,可方便单元测试。多个类同时拥有main函数也是没有问题的,只有命令行调用的那个main函数才会被执行。还有就算类是四有类,它的main函数也是可以被任意调用的。
6,想调用基类的成员,需要通过super.xxx();否则如果在xxx()中再掉xxx()则是递归,很明显你不是这个意思吧。
7,当创建一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。
8,带参数的构造器。
如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键字super显式的编写调用基类构造器的语句,并且配以适当的参数列表。调用基类构造器必须是你导出类构造器要做的第一件事情(除你调用this调用其他自己构造其外)。
9,代理。代理是继承和组合之间的中庸之道。因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露该类成员对象的所有方法(就像继承)。
10,名称屏蔽。注意区分C++和Java对重载和覆写的不同处理。Java中一般都是重载,如果非得覆写,注意在函数前面加上@Override,则会覆写基类的函数。否则都是重载。
11,在组合和继承之间选择。组合和继承都是在新的类中放置子对象,组合是显式的这么做,而继承是隐式的。如何选择?组合技术常用于在新类中是有现有类的功能而非它的接口。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是新类定义的接口,而非嵌入对象的接口。这个时候,一般在新类中嵌入一个现有类的private对象。但有时候也可以是public(很少),public意味这外部可以访问该成员,可能是为了便于理解吧。
在继承的时候,使用某个现有的类,并开发一个它的特殊版本。
12,protected关键字
“就用户而言,这是private的,但对于继承于此类的导出类或者其他任何位于同一个包内的类来说,它却是可以访问的”。
在设计上,最好的方式还是将域保持为private,你应该一直保留“更改底层实现”的权利,然后通过protected方法来控制类的继承者的访问权限。
13,向上转型
“为新的类提供方法”并不是继承技术中最重要的方面,其最重要的方面是用来表现新类和基类之间的关系。这种关系可以用“新类是现有类的一种类型”来概括。为什么叫向上转型,因为之前的类图结构总是把基类放到上面,所以就习惯了。向上转型是将一个较为专用的类型向较为通用的类型转换,所以总是很安全的。导出类是基类的一个超类,因为它总是包含了基类的所有,同时还可能拥有更多的方法和域。
如果某个方法为private,那它就不是类 的接口一部分。也就是向上转型的时候调不到它的。
14,final关键字
final可以修饰数据,修饰方法,类。
1)final数据。final修饰变量是使得其不会改变,类似于C++的常量,static final经常这样用,表示只有一份内存。final修饰的域不一定要在定义处初始化,可以在要用的时候初始化,这种叫“空白 final”有点类似于惰性初始化。初始化之后就改变不了它了。final修饰的引用表示你不能将该引用指向新的对象,但是对象本身的数据却还是可以变化的。final参数是指你不能在这个方法里面更改这个参数(或者引用重指),这种final参数主要是用在向匿名内部类传递数据 的时候用到。
2)final方法。把方法锁定,以防止任何继承类修改它的含义,即不会被覆盖掉。
final 和private关键字。类中所有的private方法都隐式的指定为final的。因为导出类无法取用private方法,所以也就无法覆盖它。
“覆盖”只有在某个方法是基类的接口的一部分时才会出现。如果一个方法是private,那它就不是基类接口的一部分。它仅是隐藏于类中的程序代码,只不过是有相同的名字而已。仅此。
3)final类。一个类被修饰为final,表示你不想任何类继承它。当然final类里面 的final域之类的,跟普通类里面的没有区别。不影响
15,初始化与类的加载
static代码是在类被第一次使用的时候加载的。假如两个类A,B,B extens A .那么当B对象生成的时候,首先运行基类A的static代码,然后是B的static代码,然后当这些类代码都执行完之后,对象就可以创建了。也就是执行对象相关代码。
好,今天到这里。