目录
Final实例字段
Java的类中,可以将实例字段设置为final(常量)。这样的字段必须在构造对象时进行初始化。即必须确保在每一个构造器执行后,这个字段的值已经被设置,并且以后不再修改。
final修饰符对于类型为基本类型(int、double)和不可变类型(类中所有方法都不会改变其对象,如String)尤其有用。
注:对于可变的类,使用final可能会造成混乱。
class Employee
{
private final String name;
private final StringBuilder evaluations;
Employee(String name){
this.name = name; //在构造对象时对常量进行初始化
evaluations = new StringBuilder(); //StringBuilder实际为一个可变类
}
public void giveGoldStar(){
//evaluations虽然声明为常量,但是由于其是可变类,因此final的作用是表示evaluations引用不会再指向另外一个StringBuilder对象。而这个对象是可以修改的。
evaluations.append(LocalDate.now() + ":Gold star! \n");
}
}
Static静态字段与静态方法
静态字段
若将类中的一个字段定义为static,则这个类的所有对象共享这个字段。而对于非静态的实例字段,每个对象都有一个副本。定义为static的字段属于类而不属于单个对象。
在实际中静态变量用的比较少,而静态常量常用。
public class Math
{
public static final double PI = 3.1415926535; //静态常量
}
class Employee
{
private static int nextId; //静态变量
private int id; //实例变量
}
静态方法
静态方法是不在对象上执行的方法,它没有隐式参数(this参数)。因此,静态方法不能访问实例变量,只能访问静态字段。在使用时,通常采用类名+方法调用。
一般在以下两种情况下使用静态方法:
- 方法不需要访问对象状态,因为它需要的所有参数都通过显式参数提供(例如:Math.pow)。
- 方法只需要访问类的静态字段(例如:Employee.getNextId)。
注:虽然一般使用类名来调用静态方法,但是使用对象的引用也可调用静态方法。不过这种写法可能会造成混淆,因为静态方法只能操作静态字段,而静态字段与对象无关。因此,建议使用类名而不是对象来调用静态方法。
class Employee
{
private static int nextId = 10;
public static int getNextId(){
return nextId;
}
public class static void main(String[] args){
Employee e = new Employee();
//类的对象以及类名均可调用静态方法
e.getNextId(); //不推荐使用
Employee.getNextId();
}
}