隐藏实现 & 复用类
访问控制符, import, 每个编译单元(.Java文件)只能有一个public类,假如还有其他类,那这些类就成为这个
public类的辅助类,这是因为他们都不是public的,因此对外边世界来说,它们都是看不到的。
编译.java文件的时候,它里面的每个类都会产生输出。其输出的文件名字就是.java里面类的名字,这样写不了
几个java文件就会产生一堆.class文件,但是不要希奇,一个能正常工作的java文件本来就是由一堆.class文件
组成的,当然也可以用jar把他们封装成java Archive (JAR)文件。java解释器会负责寻找,装载和解释这些
文件的。
package和import就似乎一个刀一个盾。是把一个单独的全局名字空间分割开来,这样不论internet上有多少人
再用java编程,你就都不会再碰到名字冲突的问题了。值得注重的是,每次创建package给它起名的时候,你也
隐含的设置了一个目录结构。这个package必须保存在由它的名字所指示的目录里,而这个目录又必须在classpath
下面。
java的访问控制符:public是众所周知的可以任何人都可以访问的;package权限,默认的访问权限没有要害词,
但通常还是把它成为package权限,(有时也成为friendly)它的意思是所有同属这个package的类都能访问这个
成员,由于同一编译单元只能同属一个package,因此同一个编译单元里的各个类,自动的可以进行相互访问。
protected, private.
接口(interface)和实现(implementation):
类只能是package和public的,假如你不希望别人访问这个类,你可以将他的构造函数设成private,这样除你之外,没人可以在创建那个类的对象了。而你则可以使用一个静态方法来创建对象。(这招在某些场合非常管用)
还有一个实现类似功能的方法,涉及到了设计模式。
复用类
要在不改动原有代码的前提下使用类。有两种方法:合成(compostion)和继续(inheritance)。
所有非primitive对象都有一个toString()方法,当编译器需要一个String而它却是一个对象的时候,编译器就会自动调用这个方法。所以当编译器从"source="+source中看到,你想把一个字符串同一个非字符串相加的时候,它就会说“由于String只能同String相加,因此我要调用source的toString(),因为只有这样才能把它转换成String!”。于是它就把这两个String连起来,然后再String的形式把结果返还给System.out.println()。假如你想让你写的类也具备这个功能,只要写一个toString( )方法就行了。
你可以为每个类都创建一个main(),而且这也是一种值得提倡的编程方法,因为这样一来,测试代码就能都放进类里了。即使程序包括了很多类,它也只会调用你在命令行下给出的那个类的main( )方法。(只要main( )是public 的就行了,至于类是不是public的,并不重要。)于是,当你输入javaDetergent的时候,它就会调用
Detergent.main()。虽然Cleanser不是public的,但是你也可以用javaCleanser来调用Cleanser.main()。这种往每个类里都放一个main()的做法,能让类的单元测试变得更轻易一些。做完测试之后,你也不必移除main();留下它可以供以后的测试用。
要害词:super, extends
派生类的初始化是从基类的初始化开始的,假如都是默认的构造函数则不用处理任何问题,但若父类的构造函数是带参数的构造函数,则需要手动利用super来调用父类的构造函数。此外,对派生类构造函数而言,调用基类的构造函数应该是它做的第一件事。
在很多情况下,清理并不是什么问题;把它留给垃圾回收器就行了。但是假如你要自己做的话,那就只能辛劳一点了,而且还要格外小心,因为在垃圾回收方面,谁都帮不上你。垃圾回收器可能永远也不会启动。即便它启动了,你也没法控制它的回收顺序。最好不要依靠垃圾回收器去做任何与内存回收无关的事情。假如你要进行清理,一定要自己写清理方法
假如Java的基类里有一个被重载了好几次的方法,那么在派生类里重新定义那个方法,是不会把基类里定义的任何一个给遮盖掉的(这点同C++不同)。其实在派生类里用相同的参数列表,相同的返回类型来覆写方法的这种做法,实在是太普通了。
继续还是合成??一般来说,合成用于新类要使用旧类的功能,而不是其接口的场合。也就是说,把对象嵌进去,用它来实现新类的功能,但是用户看到的是新类的接口,而不是嵌进去的对象的接口。因此,你得在新类里嵌入
private的旧类对象。继续则是要对已有的类做一番改造,以此获得一个非凡版本。简而言之,你要将一个较为抽象的类改造成能适用于某些特定需求的类。稍微想一下就会知道,用vehicle(车辆)对象来合成一个car(轿车)是毫无意义的——car不包含vehicle,它本来就是vehicle。继续要表达的是一种“是(is-a)”关系,而合成表达要表达的是“有
(has-a)”关系。
未完待续。。。。。。