final关键字可以用来修饰类、方法和变量(成员变量和局部变量)
1.修饰类
被final修饰过的类叫做最终类,无法被继承,不会有子类
final class Fu {
public int num = 10;
public final int num2 = 20;
/*
public final void show() {
}
*/
}
class Zi extends Fu {
// Zi中的show()无法覆盖Fu中的show()
public void show() {
num = 100;
System.out.println(num);
//无法为最终变量num2分配值
//num2 = 200;
System.out.println(num2);
}
}
//测试类
class FinalDemo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
2.修饰方法
把方法锁定,以防被任何该方法所属类的继承类覆盖。
被final修饰的方法,不可被重写(覆盖)
//父类
class Fu {
public final void show() {
System.out.println("这里是绝密资源,任何人都不能修改");
}
}
//子类(继承类)
class Zi extends Fu {
// Zi中的show()无法覆盖Fu中的show()
public void show() {
System.out.println("这是一堆垃圾");
}
}
//测试类
class ZiDemo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
报错:Zi中的show()无法覆盖Fu中的show()
3.变量
常量分为 1.字面值常量 “hello” “10” “meme” “michi”
2.自定义常量 final int x =10;
final修饰局部变量问题:
基本类型:基本类型的值不能发生改变。
引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。
class Student {
int age = 10;
}
class FinalTest {
public static void main(String[] args) {
//局部变量是基本数据类型
int x = 10;
x = 100;
System.out.println(x); // 100
final int y = 10;
//无法为最终变量y分配值
//y = 100;
System.out.println(y); // 10
System.out.println("--------------");
//局部变量是引用数据类型
Student s = new Student();
System.out.println(s.age); // 10
s.age = 100;
System.out.println(s.age); // 100
System.out.println("--------------");
final Student ss = new Student();
System.out.println(ss.age); // 10
ss.age = 100;
System.out.println(ss.age); // 100
//重新分配内存空间
//无法为最终变量ss分配值
ss = new Student();
}
}
4.final修饰的变量初始化
被final修饰的变量只能赋值一次,1.是在定义的时候赋值,
2.在构造方法完毕前赋值(非静态常量)
class Demo {
//int num = 10;
//final int num2 = 20;
int num;
final int num2;
{
//num2 = 10;
}
public Demo() {
num = 100;
//无法为最终变量num2分配值
num2 = 200;
}
}
class FinalTest2 {
public static void main(String[] args) {
Demo d = new Demo();
System.out.println(d.num);
System.out.println(d.num2);
}
}