1.2 final变量
- final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。
- final除了可以修饰基本数据类型的常量,还可以修饰对象引用。由于数组也可以被看作一个对象来引用,所以final可以修饰数组。
- 被定义为final的常量定义时需要使用大写字母命名,并且中间使用下划线进行连接,这是Java中的编码规则。
- 一个被定义为final的对象引用只能指向唯一一个对象,不可以将它再指向其他对象,但是一个对象本身的值却是可以改变的,为了使一个常量真正做到不可更改,可以将常量声明为static final。
- 创建随机数
import java.util.Random;
public class FinalStaticData{
private static Random rand=new Random();//实例化一个Random对象
//随机产生0~10之间的随机数
private final int a1=rand.nextInt(10);
1.3 final方法
final的方法不能被重写
- 一个定义为private的方法隐式被指定为final类型
class Parents{
private final void doit(){
System.out.println("父类.doit()");
}
final void doit2(){
System.out.println("父类.doit2()");
}
public void doit3(){
System.out.println(父类.doit3()");
}
}
class Sub extends Parents{
public final void doit(){ //在子类中定义一个doit()方法
System.out.println("子类.doit()");
}
final void doit2(){
System.out.printl("子类.doit2()");
}
public void doit3(){
System.out.println("子类.doit3()");
}
}
public class FInalMethod{
public static void main(String[] args){
Sub s=new Sub(); //实例化
s.doit(); //调用doit()方法
Parents p=s; //执行向上转型操作
//p.doit(); //不能调用private方法
p.doit2();
p.doit3();
}
}
在Eclipse中运行本实例,结果如下:子类.doit() 父类.doit2()
子类.doit3()
从本实例可以看出,final方法不能被覆盖,例如,doit2()方法不能在子类中被重写,但是在父类中定义了一个private final的doit()方法,同时在子类中也定义了一个doit()方法,从表面上来看,子类中的doit()方法覆盖了父类的doit()方法,但是覆盖必须满足一个对象向上转型为它的基本类型并调用相同方法这样一个条件。例如,在主方法中使用"Parents p=s;"语句执行向上转型操作,对象p只能调用正常覆盖的doit3()方法,却不能调用doit()方法,可见子类中的doit()方法并不是正常覆盖,而是生成一个新的方法。