Java类之间的关系
- 依赖(“use-a”)
一个类的方法操纵另一个类的对象,应尽可能减少相互依赖的类。 - 聚合(“has-a”)
一个类的对象包含另一个类的对象; - 继承(“is-a”)
对象与对象变量
在Java中,任何对象变量的值都是对存储在另一个地方的一个对象的引用,new操作符的返回值也是一个引用。可以显式地将对象变量设置为null,表明这个对象目前没有引用任何对象。
访问器和更改器
只访问对象而不修改对象的方法称为访问器方法。在Java中,访问器方法与更改器方法在语法上没有明显区别;在C++中,带有const后缀的方法是访问器方法,默认为更改器方法。
final实例域
可以将实例域定义为final,构建对象时必须初始化这样的域。final关键字只是表示存储在变量中的对象引用不会再指示其他的对象,但是该对象可以修改。
- final变量:final变量是只读的;
- final方法:该方法不能被子类的方法重写,在编译时静态绑定,不需要在运行时动态绑定;
- final类:不能被继承的类;
静态域与静态方法
- 静态域:每个类只有一个静态域,但每个对象对所有实例域有自己的一份拷贝;
- 静态常量:使用static final定义;
- 静态方法:不能向对象实施操作的方法,故静态方法不能访问类的实例域,但是可以访问自身类中的静态域;建议使用类名调用静态方法。
main方法
每一个类可以有一个main方法,用于对类进行单元测试。执行类中的main方法:
方法参数
Java对对象采用的是按值传递,故对两种类型的方法参数修改时,根据类型不同有所差异:
- 基本数据类型:方法不能修改基本数据类型的参数;
- 对象引用:由于方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象,因此可以修改对象引用的参数;但是方法不能让对象参数引用一个新的对象。12345678910111213141516public static void tripleValue(double x) //不可用{x = x*3;}public static void tripleSalary(Employee x) //可用{x.raiseSalary(200);}public static void swap(Employee x, Employee y)//不可用{Employee temp = x;x = y;y = temp;}
包
Java允许使用包将类组织起来,使用包确保类名的唯一性。从编译器的角度来看,嵌套的包之间没有任何关系,如java.util包与java.util.jar包无关。每一个都拥有独立的类集合。
- 一个类可以使用所属包中的所有类,以及其他包中的共有类。
- 使用import static静态导入,可以在使用类的静态方法和静态域时不加类名前缀:12import static java.lang.System.*;out.println("Hello World");
将类放入包中
若要将类放入包中,则必须将包的名字放在源文件开头,包中定义类的代码之前,并将包中的文件放到与完整的包匹配的子目录中。若没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包中。
包作用域
如果没有指定public或private,这个部分(类、方法或变量)可以被同一个包中的所有方法访问。
类路径
类文件可以存储在JAR(Java归档)文件中,一个JAR文件中,可以包含多个压缩形式的类文件和子目录,JAR文件使用ZIP格式组织文件和子目录。
为了使类能够被多个程序共享,需要设置:
- 将类放在一个目录下,该目录是包树状结构的基目录;
- 将JAR文件放在一个目录下;
- 设置类路径,类路径包括基目录、当前目录(.)、JAR文件。
例如:12/home/user/classdir:.:/home/user/archieves/archieve.jar //UNIX环境c:\classdir;.;c:\archieves\archieve.jar //Windows环境
javac编辑器总是在当前目录中查找文件,但Java虚拟机仅在类路径中有“.”目录时才查看当前目录
建议采用-classpath选项指定类路径:
文档注释
JDK包含javadoc,可以由源文件生成一个HTML文件。
注释的插入
javadoc实用程序从以下特性中抽取信息:
- 包;
- 共有类与接口;
- 共有的和受保护的构造器及方法;
共有的和受保护的域;
注释以/**开始,以*/结束,每个/**…*/文档注释在标记之后紧跟着自由格式文本,标记由@开头;自由格式文本的第一句应为一个概要性的句子,javadoc实用程序自动将这些句子抽出来形成概要页。类注释:类注释必须放在import语句之后,类定义之前;
方法注释:每个方法注释必须放在所描述的方法之前:
- @param变量描述:将对当前方法的“param”(参数)部分添加一个条目;
- @return描述:将对当前方法添加“return”(返回)部分;
- @throws类描述:将添加一个注释,用于表示这个方法有可能抛出异常;12345678910/*** Raise the salary of an employee.* @param byPercent the percentage by which to raise the salary (e.g. 10 means 10%)* @return the amount of the raise*/public double raiseSalary(double byPercent){double raise = salary * byPercent / 100;salary += raise;return raise;}
域注释:只需对公有域(通常指静态常量)建立文档;
- 通用注释:
- @author姓名;
- @version文本;
- @since文本:这里的text可以是对引入特性的版本描述;
- @deprecated文本;
- @see引用;
类设计技巧
- 一定要保证数据私有;
- 一定要对数据初始化;
- 不要在类中使用过多的基本类型;
- 不是所有的域都需要独立的域访问器和域更改器;