静态字段
static 修饰的字段称为静态字段,这个类的所有实例共享静态字段
class Employee{
private static int unique=1;
private String name;
private int id;
public void setId() {
this.id = unique; //设置某个对象id为unique
unique++; //静态字段 +1
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
}
即使有1000个Employee的实例,也只有一个unique 静态字段,也就是说这1000个实例使用一个unique字段。因为静态字段属于类,不属于任何对象
静态方法
静态方法是不在对象上执行的方法。换句话说,它没有隐式参数(隐式参数可以理解为 this,显式参数就是括号中传递的参数)
静态方法只能访问类中的静态字段,不能访问实例字段
class Employee{
private static int unique=1;
private int age;
public static int add(int a,int b){
return a+b+unique; //只能访问静态字段,不能访问age
}
}
调用的时候,直接用类名访问静态变量
int sum=Employee.add(1,2);
可以使用对象调用静态方法,但是对象的值与静态方法毫无关系,反而容易混淆,所以建议直接用类名调用静态方法
以下两种情况可以使用静态方法:
- 方法不需要访问对象状态,所需要的值都通过显式参数传递
- 方法只需要访问静态字段
知识点补充:构造器
如果一个类没有定义构造器,那么会自动提供一个无参构造器,并且将所有字段设为默认值。一旦定义了构造器,就不会自动定义无参构造器了,必须要手动定义,否则就是没有无参构造器
class Zyy{
private int name;
private int age;
pub
}
上面代码没有定义任何构造器,那么会自动生成一个无参构造器,并把所有字段设为默认值
Zyy zyy=new Zyy(); //这是合法的
class Zyy{
private int name;
private int age;
public Zyy(int name,int age){
this.name=name;
this.age=age;
}
}
上面代码定义了一个有参构造器,所以实例化时必须有两个参数
Zyy zyy=new Zyy(10,10); //合法
Zyy zyy=new Zyy(); //不合法,因为定义了构造器,并且没有定义无参构造器