对象和类 (2)
辽宁经济职业技术学院信息系
硕士、副教授 陈英
Final实例字段
可以把一个实例字段定义为 final(不能
改变的)。
在对象被构造时,这种字段必须被初始
化,即必须保证在每一个构造器结束之
前其值已被设定。
以后字段的值不能改变。
常量
静态变量是很少见的。然而,静态常量却很普遍。例如,
Math类中定义了一个静态常量:
Public class Math
{
… …
public static final double PI = 3.14159265358979323846;
… …
}
如果关键字 static被省略,那么 PI就是 Math类的一个
实例字段。即你需要 Math类的一个对象来访问 PI,
并且每个对象都有自己的对 PI的一份拷贝。
这样就可以在程序
中使用 Math.PI来访
问此常量。
静态方法
静态方法是不对对象施加的方法。
例如 Math类的 pow方法是一个静态方法,
其表达式,Math,pow(x,y)
计算幂 x y。 它并不使用任何一个 Math对
象来执行此任务。即,它没有隐式参数 。
可以把静态方法看作是没有 this参数的方
法。
因为静态方法并不操作对象,所以我们不
能用一个静态方法访问实例字段。
静态方法可以访问其自己类中的静态字段。
yx
静态方法
可以使用类的名字来调用其静态方法。
使用对象来调用静态方法也是合法的。
但这种表示会使人迷惑。
提倡使用类名来调用静态方法而不是对
象。
在以下两种情况下使用静态方法:
1) 当一个方法不需要访问对象状态时。
2) 当一个方法只需要访问类中的静态变
量时。
Main方法
可以不使用任何对象来调用静态方法。
例如,从没有构造 Math类的任何对象而
调用 Math.pow。
基于同样的原因,main方法是一个静态
方法。 Main方法并不对任何对象施加操
作。事实上,当程序开始执行时,还不
存在任何对象。
静态 main方法被执行,并构造程序所需
要的对象。
Main方法
每个类都可能有一个 main方法。这是对
类进行单元测试的一个很方便技巧。
在实例 StaticTest.java中的 Employee类有
一个 main方法,如果想单独测试
Employee类,则可以执行 java Employee。
而如果使用 java StaticTest来执行此应用
程序,则 Employee类的 main方法永远不
会被执行。
方法参数
Java程序设计语言总是使用传值调用( call by
value)。它表示方法只得到调用者所提供的值。
传值调用意味着方法得到的是所有参数值的一
个拷贝。方法不能修改传递给它的任何参数变
量的内容。
例如,看下面的调用:
double Percent= 5;
e,raiseSalary (Percent);
不管此方法是如何实现的,调用此方法后,
Percent的值仍旧是 5。
方法参数
有两种方法参数:
1) 基本类型(数字,布尔值)
2) 对象引用
方法不可能修改基本类型的参数。
方法可以改变对象参数的状态。
方法不能使一个对象参数指向一个新的
对象。
对象构造 —— 方法重载
当多个方法具有相同的名字而含有不同
的参数时,便发生重载。
Java允许对任何方法重载,而不只是构
造器方法。
如果在构造器中没有明确地给某个字段
的值,那么此字段会被自动地赋值以一
个默认值:
1)若是数字则被赋值以 0;
2)若是布尔类型则被赋值以 false;
3)若是对象引用则被赋值以 null。
对象构造 —— 默认构造器
默认构造器是指没有参数的构造器。
如果编写了一个没有构造器的方法,则
系统会自动为此方法提供一个默认构造
器。
此默认构造器将所有的实例字段初始化
为默认值。
如果一个类中含有多个构造器但却没有
默认构造器,那么如果没有构造参数的
话,它将不能合法地构造对象。
对象构造 —— 实例分析
在 EmployeeTest.java中的 Employee类中
提供了惟一的一个构造器:
Employee(String n,double s,int year,int
month,int day)
在此类中构造默认员工是不合法的。即
调用 e = Employee() 将会产生一个
错误。
对象构造 —— 显式字段初始化
由于在类中可以重载构造器方法,所以可以
采用多种方式来设置类中实例字段的初始状
态。
不管什么样的构造器调用,确保每个实例字
段都被设置为某个有意义的值是一种很好的
习惯。
初始值不一定是一个常数值。
对象构造 —— 参数名
public Employee(String n,double s)
{
name = n;
salary = s;
}
以单个字母作为参
数的缺点是需要阅
读代码才能知道参
数 n和 s 表示的是什
么。
public Employee(String aName,double aSalary )
{
name = aName;
salary = aSalary ;
} 在每个参数前加一
前缀,a”,这样做
很简洁。任何读者
都可以清楚地知道
参数的含义。
对象构造 —— 参数名
参数变量覆盖了具有同样名字的实例字段。
例如,如果你把一个参数命名为 salary,那
么 salary将指向参数,而不是一个实例字段。
但是你仍然可以通过 this.salary来访问此实
例字段。
public Employee(String name,double salary )
{
this.name = name ;
this.salary = salary ;
}
this表示隐
式参数,即
被构造的对
象。
对象构造 —— 初始化块
在类声明中可以包含任意数量的代码块。
只要构造了此类的一个对象,这些代码块
就会被执行。
初始化块首先被运行,然后构造器的主体
部分被执行。
更常见的是直接把初始化块放在构造器内。
三种初始化数据字段的方式:
1) 通过在构造器中设置值。
2) 通过在声明中赋值。
3) 初始化块。
构造器被调用后的执行过程
1,所有的数据字段被初始化为默认值
( 0,false或 null).
2,如果一个构造器的第一行调用了另一个构
造器,则执行另一个构造器。否则,按照
在类声明中出现的次序依次执行所有的字
段初始化语句和初始化块。
3,执行构造器的主体。
Java.util.Random
Random() 产生一个新的随机数产生器。
int nextInt(int n) 返回在 0~1之间的
随机数