final修饰符
final修饰常量
开发中使用final较多的地方---用来修饰常量
当程序中使用到的数据是固定不变的,请使用final对其进行修饰!
常量名使用大写,多个单词间使用下划线分割
//全局常量
public static final double PI = 3.1415926;
//局部常量
final int TIMES = 10;
final修饰方法
被final修饰的方法不能被子类覆盖
如,某个类作为父类,其中某个方法中的计算逻辑,调用关系是不能被子类覆盖的。
通过final修饰符来修饰这个方法,子类将无法重写该方法。
确保了父类中方法的永久有效。
示例:
Parent类中的invoke方法非常重要,不能被子类覆盖
Parent类
public class Parent {
Parent() {
System.out.println(this);
invoke();
}
public void invoke() {
System.out.println("do something important");
}
}
Child类,由于Parent类中的invoke方法没有被final修饰,所以,Child中一旦覆盖掉,将导致Parent中定义的invoke方法失效。
public class Child extends Parent {
public Child() {
System.out.println(this);
}
public void invoke() {
System.out.println("do nothing!");
}
}
测试代码
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.invoke();
}
//运行结果:父类的invoke方法被子类覆盖了,并没有得到执行
/*
Child@1b6b7f83
do nothing!
Child@1b6b7f83
do nothing!
* */
}
使用final修饰Parent中的invoke方法
public class Parent {
Parent() {
System.out.println(this);
this.invoke();
}
final public void invoke() {
System.out.println("do something important");
}
}
public class Child extends Parent {
public Child() {
System.out.println(this);
}
//invoke()在父类中被final修饰,子类中只能使用而无法覆盖
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.invoke();
}
//运行结果:父类的invoke方法被final修饰后,子类将无法对其覆盖
/*
Child@1b6b7f83
do something important
Child@1b6b7f83
do something important
* */
}
final修饰类
如果该类不允许被其它类继承(继承会破坏封装性),使用final进行修饰;
final public class Parent {
Parent() {
System.out.println(this);
this.invoke();
}
final public void invoke() {
System.out.println("do something important");
}
}