|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
隐藏实现 & 复用类 访问控制符, 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)”关系。 未完待续。。。。。。 返回类别: 教程 上一教程: ?Java Open Single Sign-On Project-介绍 下一教程: Java中文问题详解,底层编码解剖 您可以阅读与"java之旅(7)隐藏实现 & 复用类"相关的教程: · 《Java编程思想》(第二版)第5章:隐藏实现细节 · "Java中可复用事件处理的设计与实现"代码 · 利用Java实现串口全双工通讯 · 利用Java实现zip压缩/解压缩 · 产生彩色验证码_(JAVABEAN实现) |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |