类的基本概念
类的注意事项
对象与对象变量
构造与析构
静态字段与静态方法
包
类的设计技巧总结
1.由类构造对象的过程称为创建类的实例。
2.封装是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。
3.对象中的数据称为实例字段,建议将其全部设置为private。
实例字段可以理解为类中的非静态成员变量,与之相对应的是静态字段。
4.操作数据的过程称为方法。
5.作为一个类的实例,特定对象都有一组特定的实例字段,这些值的集合称为这个对象的当前状态。
6.通过扩展一个类来建立另外一个类的过程称为继承。
7.调用方法后会改变对象的状态,称这个方法为更改器方法,只访问对象而不修改对象的方法称为访问器方法。二者在语法上没有明显区别。
8.只返回实例字段值的方法称为字段访问器。
9.如果类中所有方法都不会改变其对象,这样的类就是不可变类。例如String类就是不可变类。
10.重载是指多个方法有相同的名字,不同的参数。
11.方法名和参数类型构成方法的签名。返回类型不是方法签名的一部分,因此不能有两个名字、参数类型相同但返回类型不同的方法。
1.在一个源文件中,只能有一个公有类,这个类的名字必须与文件名相匹配,非公有类的数目可以是任意个。
2.所有方法必须在类的内部定义。
3.不要编写返回可变对象引用的访问器方法,因为这会使被赋给返回值的变量与返回值引用同一个对象,虽然这个返回值引用的字段在类中是private属性,但是可以通过修改被赋给返回值的变量来达到修改该字段的目的。如果一定要返回一个可变对象的引用,可以使用clone方法,例如:
class A
{
...
public B getvalue()
{
return (B) value.clone();
}
...
}
如果需要返回一个可变数据字段的副本,就应该使用clone。
4.对于可变的类(也就是类中的某些方法会改变其对象)而言,使用final关键字有可能产生混乱。因为final关键字只是表示存储在对象变量中的对象引用不会再指示另一个不同的对象,但是这个对象可以更改。
System类的setOut方法可以将System.out(静态常量)设置为不同的流,这是因为setOut方法是一种原生方法,它不在Java语言中实现,可以绕过Java语言的访问控制机制。
5.Java总是采用按值调用。
6.可以使用main方法对特定类进行单元测试。
7.构造器的格式如下:
public ClassName(...) {
// Initialization code
}
注意无void等标识。
考察以下三行语句:
Date deadline;
Date anniversary = new Date();
Date birthday = anniversary;
第一行定义了一个对象变量deadline,它可以引用一个Date类型的对象。但是,deadline不是一个对象,且在这行代码中没有引用任何对象,任何Date方法都不可以在deadline变量上使用。
第二行定义了一个对象变量anniversary,它引用了一个新构造的对象,事实上,它还可以引用一个已有的Date类型的对象,也就是第三行所示。
在第三行中,两个对象变量都引用了同一个对象。
需要注意:对象变量并没有实际包含一个对象,它只是引用一个对象。
也就是说,任何对象变量的值都是对存储在另外一个地方的某个对象的引用。
new操作符返回的也是一个引用,以第二行为例,new Date()返回的引用由左式中的对象变量anniversary存储。
1.构造器中没有显式地为字段设置初值,那么就会自动地赋为默认值:数值为0、布尔值为false、对象引用为null。这是字段与局部变量的一个重要区别。
2.如果类中提供了构造器,系统将不会再提供无参默认构造器。
3.参数变量会遮蔽同名的实例字段。这时,实例字段可以通过this这个隐式参数访问。
4.建议总是将初始化块放在字段定义之后。
5.调用构造器的具体步骤:
6.静态字段的初始化详见“ 静态字段与静态方法”一节。
7.Java不支持析构器。
1.每个类最多只有一个静态(static)字段,该类的所有实例将共享同一个静态字段。
2.即使没有类,该类的静态字段也存在。它属于类,但不属于任何单个的对象。
3.静态变量较少使用,但是静态常量很常用。普通常量需要通过类的一个对象去访问该常量,而静态常量却可以直接通过类名.静态常量访问,比如Math库中的数学函数。
4.静态方法是一种没有隐式参数(this)的方法,不能在对象上执行操作,所以静态方法不可以访问实例字段,但可以访问静态字段。
5.建议使用类名而不是对象来调用静态方法。因为使用对象调用静态方法时,该方法所影响对象的状态不随对象的不同而不同。
6.使用静态方法的两种情况:
7.可以使用静态的初始化块对复杂的静态字段初始化。
static
{
// initialization code
}
1.使用包可以保证类名的唯一性。同名包只要放在不同的包中就不会产生冲突。
2.一个类可以使用所属包中的所有类和其他包中的公共类。
3.可以使用import语句(紧跟package语句之后)简便地引用包中的各个类,例如:
import java.math.*;
import java.util.Date;
import static java.lang.System.*;
第三行为静态导入,该语句允许导入路径中的静态方法和字段。
注意:只能使用星号(*)导入一个包,下面的两个语句是错误的:
import java.*;
import java.*.*;
4.如果出现命名冲突时,可以在使用这个同名类时在前面加上完整的包名引用。
5.import与C/C++中的#include不同,package与import指令更像是C/C++中的namespace和using指令。
6.使用package语句将该源文件中的类放入包中。
7.标记public的可供任意类使用,标记private的仅供定义它们的类使用,若无指定,该部分(类、方法、变量)可被同一个包中所有方法使用。
1.一定要保证数据私有。
2.一定要对数据进行初始化。
3.不要在类中使用过多的基本类型。
4.不是所有的字段都需要单独的字段修改器和字段访问器。
5.分解有过多职责的类。
6.类名和方法名要能够体现它们的职责。
7.优先使用不可变的类。