1.Final 关键字
final 关键字代表最终的,不可改变的
final 可以修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
final修饰类,即代表它不能有儿子类,不能被继承。
final修饰类 方法
使用语法:
声名类:final class 类名 {//类体}
声名方法:修饰符(public/private/default/protected) final 返回值类型 方法名(){
//方法体
}
举例:
final class Show{
public final void show(){
//方法体
}
}
注意:
- 如果定义了一个final类,那么其中所有的成员方法都不能被重写(因为它没有子类)
- 当用final修饰方法后,这个方法就是最终方法,也就是不能被覆盖重写。
而且对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。有抽象方法的abstract类被继承时,其中的方法必须被子类Override,而final不能被Override。
例如:
因为抽象的方法子类继承后必须要重写父类的方法,而父类的方法被final修饰后就不能被重写了
但是如果父类的方法是抽象的,子类的方法重写还是可以被final关键字修饰的。
final修饰变量
当final修饰基本数据类型的变量时,只能被赋值一次,并且定义再类里面,方法外的变量必须在定义的时候赋值,否则就会报错
例如:
而定义在方法内就没有问题
而且定义的变量只能被赋值一次,而且只能手动赋值,再次赋值也会报错
当final修饰引用类型的变量时,变量对应的地址值不能变,但是地址所指向的对象可以改变
例如:
当引用类型变量没有被final修饰的时候
public class Test9 {
public static void main(String[] args) {
Show show = new Show("喜羊羊");
System.out.println(show);
System.out.println(show.name);
show=new Show("灰太狼");
System.out.println(show);
System.out.println(show.name);
}
}
class Show {
String name;
public Show(String name) {
this.name=name;
}
}
运行结果:地址值不一样
但当用final修饰的时候,地址值不可变,会报错
原因是什么呢?
因为final修饰了这个实例化对象,这个对象所对应的地址就不能被修改,只能修改它所指向的对象
public class Test9 {
public static void main(String[] args) {
final Show show = new Show("喜羊羊");
System.out.println(show);
System.out.println(show.name);
show.name="灰太狼";
System.out.println(show);
System.out.println(show.name);
}
}
class Show {
String name;
public Show(String name) {
this.name=name;
}
}
运行结果:地址不变,所指向的对象改变
查询API发现像public final class String 、public final class Math、public final class Scanner 等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。
例如:String