导言:final,"最终"、“不可变性”,xxx是工程师精心设计的艺术品!艺术品易碎!用final就是拒绝修改,防止世界被熊孩子破坏,维护世界和平!
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外String类就是一个final类,那么今天我们就来了解final这个关键字的用法。
首先是final的引入,为什么要有final?
请看一段最常见的继承代码:
public class FinalTest {
/**
* 权兴权意-2016.10.11
* final关键字(最终-类方法变量)
*/
public static void main(String[] args) {
Son s = new Son();
s.show();
}
}
class Father{
public void show(){
System.out.println("父类珍贵资源。");
}
}
class Son extends Father{
@Override
public void show() {
System.out.println("子类垃圾资源。");
}
}
好端端的父类珍贵资源一眨眼就变成了子类垃圾资源。
我们要世界和平~
于是final出现了。
修改父类的show方法:
public final void show()
提示:Cannot override the final method from Father
一段继承代码,一个常见现象就是方法重写,子类方法覆盖父类方法。
但如果我们不想让子类覆盖,只想让他使用,那么我们就用final。
接下来,我们系统学习一下final的特点:
final关键字(最终-修饰类、方法、变量)
类,不能被继承。方法,不能被重写。变量,是常量。
ps-补充:
常量:
字面值常量:"Hello"、10、true
自定义常量:final int x = 10
下面我们通过代码测试一下:
类,不能被继承。
final class Father···
提示:The type Son cannot subclass the final class Father
方法,不能被重写。
引入时已经测过了。
变量,是常量。
在Father类中添加如下代码:
public int num1 = 10;
private int num2 = 20;
在Son类的show方法中添加如下代码:
num1 = 20;
num2 = 30;//提示:The field Father.num2 is not visible
最后附上完整源代码:
public class FinalTest {
/**
* 权兴权意-2016.10.11
* final关键字(最终-类方法变量)
* 类,不能被继承。方法,不能被重写。变量,是一个常量。
* 常量:
* 字面值常量:"Hello"、10、true
* 自定义常量:final int x = 10
*/
public static void main(String[] args) {
Son s = new Son();
s.show();
}
}
/*
* 一段继承代码,一个现象,方法重写,子类方法覆盖父类方法。
* 但如果我们不想让子类覆盖,只想让他使用,那么我们就用final.
*/
class Father{
public int num1 = 10;
private int num2 = 20;
//final class Father{
public void show(){
//public final void show(){
System.out.println("父类珍贵资源。");
}
}
class Son extends Father{
//The type Son cannot subclass the final class Father
@Override
public void show() {
//Cannot override the final method from Father
//super.show();
num1 = 20;
//num2 = 30;
//The field Father.num2 is not visible
System.out.println("子类垃圾资源。");
}
}