类之间的关系
在类之间,最常见的关系有
- 依赖(“uses-a”)如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
- 聚合(“has-a”)类A的对象包含类B的对象。
- 继承(“is-a”)
对象变量
一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。可以显式地将对象变量设置为null,表明这个对象变量目前没有引用任何对象。
可以将Java的对象变量看作C++的对象指针。Date birthday等同于Date* birthday;所有的Java对象都存储在堆中。在Java中,必须使用clone方法获得对象的完整拷贝。
类的定义
在Java中,最简单的类定义形式为:
class ClassName
{
field1
field2
…
constructor1
constructor2
…
method1
method2
…
}
在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。关键字public意味着任何类的任何方法都可以调用这些方法。
构造器
构造器是一种特殊的方法,用来构造并初始化对象。构造器的名字应该与类名相同。构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
关于构造器
- 构造器与类同名
- 每个类可以有一个以上的构造器
- 构造器可以有0个,1个或多个参数
- 构造器没有返回值
- 不要在构造器中定义与实例域重名的局部变量。
静态域与静态方法
如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。在绝大多数的面向对象程序设计语言中,静态域被称为类域。
静态对象是一种不能向对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。可以认为静态方法是没有this参数的方法。Employee类的静态方法不能访问Id实例域,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。
我们建议是引用类名,而不是对象来调用静态方法。
在下面两种情况使用静态方法:
- 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)
- 一个方法只需要访问类的静态域(例如:Employee.getNextId)。
static: 属于类且不属于对象的变量和函数。静态方法还有另外一种常见的用途。类似LocalDate和NumberFormat的类使用静态方法来构造对象。
final实例域
可以将实例域定义为final。构建对象时必须初始化这样的域。也就是说,必须确保在每一个构造器执行之后·,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。final修饰符大都应用于基本(primitive)类型域,或不可变类的域。
方法参数
方法参数共有两种类型:基本数据类型和对象引用。一个方法不可能修改一个基本数据类型的参数,而对象引用作为参数就不同了。
Java中方法参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。
方法的重载
如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用;如果传递的是double型参数,则double类型的max方法体会被调用,这叫做方法重载;
就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表。Java编译器根据方法签名判断哪个方法应该被调用。方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。
Java允许重载任何方法,而不只是构造器方法。因此,要完整地描述一个方法,需要指出方法名以及类型参数。这叫做方法的签名。
初始化数据域的三种方式:
- 在构造器中设置值
- 在声明中赋值
- 初始化块
包作用域
如果没有指定public或private,这个部分(类,或方法或变量)可以被同一个包中的所有方法访问。