静态域:
如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。例如,加入需要给每一个雇员赋予唯一的标识码。这里给的Employee类添加一个实例域id和一个静态域nextId:
class Employee
{
private static int nextId = 1;
private int id;
}
现在。每个雇员对象都有一个自己的id域。但这个类的所有实例将共享一个nextid域。换句话说,如果有1000个Employee类的对象,则有1000个实例域id。但是。只有一个静态域nextId。即使没有一个雇员对象,静态域nextId也是存在的。它属于类,而不属于任何独立的对象、
下面一个简单的方法:
public void setId()
{
id = nextId;
nextId++;
}
假定为harry设定雇员标识码:
harry.setId();
harry的id域被设置为静态域nextId当前的值,并且静态域nextId的值加1:
harry.id = Employee.nextId;
Employee.nextId++;
静态常量:
静态变量使用得比较少,但是静态常量却使用的比较多。例如,在Math类中定义了一个静态常量:
public class Math
{
public static final double PI = 3.1415926535897932384624;
}
在程序中,可以采用Math.PI的形式或者这个常量。
如果关键字static被省略,PI就变成了Math类的实例域。需要通过Math类的对象访问PI,并且每一个Math对象都有他自己的一份PI拷贝。
#这句话的理解:加了static,不用创建类的对象,就可以直接调用类里面对应的数据。但是static去掉,必修创建类的实例。才能访问
静态方法:
静态方法是一种不能向对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。表达式:
Math.pow(x, a)
不使用任何Math对象。换句话讲,就是没有隐式的参数。
可以认为静态方法是没有this参数的方法。
Employee类中的静态方法不能访问Id实例域,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。下面是使用这种静态方法的一个示例:
public static int getNextId()
{
return nextId; //return static field
}
可以通过类名调用这个方法:
int n = Employee.getNextId();
注释:可以使用对象调用静态方法。例如,如果harry是一个 Employee对象,可以用harry. getnextld()代替Employee. getnextld()。不过,这种方式很容易造成混淆,其原因是 getnextld方法计算的结果与 harry毫无关系。我们建议使用类名,而不是对象来调用静态方法。
下面两种情况下使用静态方法:
* 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供。例如(Math.pow())
* 一个方法只需要访问类的静态域(例如:Employee.getNextId)
main方法:
不需要使用对象调用静态方法。例如,不需要构造Math类对象就可以调用Math.pow
同理,main方法也是一个静态方法。
public class Application
{
public static void main(String[] args)
{
// construct objects here
... ...
}
}
main 方法不对任何对象作操作。事实上,在启动程序时候还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象。
提示: 每一个类可以有一个main方法。这是一个常用于对类进行单元测试的技巧。例如,可以在Employee类中添加一个main方法:
package testbotoo; public class StaticTest { public static void main(String[] args){ //unit test
Employee[] staff = new Employee[3]; staff[0] = new Employee("tom",123); staff[1] = new Employee("jin", 234); staff[2] = new Employee("jack", 899); for(Employee e : staff) { e.setId(); System.out.println("name="+e.getName()+",salary="+e.getSalary()+",id="+e.getId()); } } } class Employee { private static int nextId = 1; private String name; private double salary; private int id; public Employee(String n, double s) { name = n; salary = s; id = 0; } public String getName() { return name; } public double getSalary() { return salary; } public int getId() { return id; } public void setId() { id = nextId; //set id to next available id
nextId++; } public static int getNextId() { return nextId; //return static field
} public static void main(String[] args) { Employee e = new Employee("Herry", 10); System.out.println(e.getName()+" "+e.getSalary()); } }