java===java基础学习(8)---静态域与静态方法

时间:2021-03-07 15:37:57

静态域:
如果将域定义为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());
}
}