final关键字代表最终,不可改变的,常见四种用法:
1:可以用来修饰一个类;
2:可以用来修饰一个方法;
3:可以用来修饰一个局部变量;
4:可以用来修饰一个成员变量。
1:可以用来修饰一个类;
/*
当final关键字用来修饰一个类的时候
格式:
public final class 类名称{
//.....
}
含义:当前这个类不能有任何的子类(也称为太监类)
一个类如果是final类,那么其中所有的成员方法都无法进行覆盖重写(因为不能被继承),
但是final可以有父类,可以覆盖重弄父类中的成员方法
*/
public final class MyClass /*extends Object*/ {
public void method(){
System.out.println("方法执行!");
}
}
public class MySubClass /*extends MyClass*/ {//会报错,final修饰的类不能被继承
}
2:可以用来修饰一个方法;
/*
当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。
格式:
修饰符 final 返回值类型 方法名称(参数列表){
//方法体
}
注意事项:
对于类,方法来说,abstract关键字与final关键字不能同时使用。
原因:abstract修饰的方法在被非抽象类继承的时候,该方法必须被覆盖重写,而被final修饰的方法为
最终方法,不能被覆盖重写,互相矛盾。
*/
public abstract class Fu {
public final void method(){
System.out.println("父类方法!");
}
}
public class Zi extends Fu {
//会报错,不能覆盖重写父类中final修饰的方法
/* @Override
public void method(){
System.out.println("覆盖重写父类中的method方法!");
}*/
}
3:可以用来修饰一个局部变量;
public class Demo01Fianl {
public static void main(String[] args) {
int num1 = 10;
System.out.println(num1);//10
num1 = 20;
System.out.println(num1);//20
//一旦使用final用来修饰局部便令,那么这个变量就不能进行修改,一次赋值,终生不变。
final int num2 = 100;
System.out.println(num2);//100
//num2 = 200;//报错,用final修饰的局部变量不能被重新赋值,只能进行唯一一次的赋值
final int num3;
num3 = 100;
//对于基本类型来说,不可变说的是变量当中的数据不可以改变
//对于引用类型来说,不可变说的是变量当中的地址值不可改变
Person p1 = new Person("李四", 20);
System.out.println(p1);//cn.itcast.DemoDay07.Person@7b23ec81
System.out.println("我叫"+p1.getName()+",今年"+p1.getAge()+"岁");//我叫李四,今年20岁
p1 = new Person("张三",30);
System.out.println(p1);//cn.itcast.DemoDay07.Person@17a7cec2
System.out.println("我叫"+p1.getName()+",今年"+p1.getAge()+"岁");//我我叫张三,今年30岁
System.out.println("=====================================");
//用final关键字进行修饰
final Person p2 = new Person("王五", 100);
System.out.println(p2);//cn.itcast.DemoDay07.Person@65b3120a
System.out.println("我叫"+p2.getName()+",今年"+p2.getAge()+"岁");//我叫王五,今年100岁
//错误写法,final的引用类型变量,其中的地址不可改变,要想变化可以通过其中的getXXX,setXXX方法进行秀修改
//p2 = new Person("赵六",200);
p2.setName("XXX");
p2.setAge(200);
System.out.println(p2);//cn.itcast.DemoDay07.Person@65b3120a,地址没有发生变化
System.out.println("我叫"+p2.getName()+",今年"+p2.getAge()+"岁");//我叫XXX,今年200岁
}
}
4:可以用来修饰一个成员变量。
1.用于成员变量具有默认值,所以用了final之后必须进行手动赋值,不能再给默认值了
2.对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
3.必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。
*/
public class Student {
private final String name;//这里是通过构造方法进行赋值的
public Student() {
this.name = "XXX";
}
public Student(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}