final关键字:我偏不让你继承

时间:2023-02-13 00:58:18


哈喽,小伙伴们大家好,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!

这一节啊,咱们要学习的内容是Java所有​​final​​关键字。

之前呢,我们学习了继承,这大大提高了代码的灵活性和复用性。但是总有一些时候,我们的类不希望被子类继承,成员属性不希望被子类修改,成员方法不希望被子类重写,那该怎么办呢?

final关键字相当于“最终”或“不可更改”,在生活中,比如学校期末考试的成绩是“最终”的,不可再更改。

同样在java程序中,final关键字也表示最终,用于修饰变量、方法和类,其含义是指不可更改,即所修饰的类不可以被继承,修饰的方法不可以被重写,修饰的变量为常量,值不可以改变。

1.final 修饰类

final 修饰类代表这个class不允许被继承。

注意,class左边的访问修饰符(比如public)和final的位置可以互换。不过,我们一般习惯于讲final写在public后面。

比较典型的,就是String类,它就是final的。

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {

}

为什么呢?

  1. 保证String类的安全性,防止被其他类继承,重写String类的方法,破坏String类的语义,导致程序出错。
  2. String类是一个特殊的类,它的内部实现了字符串的指针,可以优化字符串的操作效率,如果被其他类继承,就可能导致内部实现的细节被破坏,影响性能。

总结下来就是,String类用的很频繁,而且已经写的够牛逼了,你就别瞎改啦。

2.final 修饰成员方法

final 修饰成员方法,就是在返回值左边加上final关键字,这样一来这个方法就不能再被子类重写,但是在访问权限足够的情况下依然能够被访问和调用,也可以被子类继承使用。

3.final 修饰方法内的局部变量

public final void sayHello(){
final String name = "keke";
System.out.println("Hello, I am a "+name+"!");
}

final可以修饰方法内的局部变量,被修饰的变量不能再被修改。

PS:final 修饰方法内的局部变量,你必须在这个变量被使用前进行初始化!

其实吧,不仅是final的变量,任何局部变量你不初始化都不能用啊。。。

String aa;
System.out.println(aa); //报错

4.final 修饰成员变量

final修饰成员方法,该成员方法就不能被子类重写,但是仍然可以被子类继承并可以通过子类对象调用该方法。

final修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败。

final关键字:我偏不让你继承

如图所示,你不能声明一个final变量却不给他赋值。给final变量赋值你有两种方式,一个是在构造方法中赋值,另一个是在定义的时候就赋值。

从深层次讲,就是你必须得在这个类的对象出现之前就给final变量赋值,因此你不能在set方法中给他赋值,因为你必须先new对象出来才能调用set方法啊。

5.final修饰的局部变量能改属性吗

就是说,在一个方法里,我定义一个局部的引用类型变量,而且还设置了final,那么我们可以修改它的属性值吗?

public static void main(String[] args) {
final Student s = new Student();
s.setMoney(200000);
System.out.println(s.getMoney());
}

答案是当然可以,final修饰的变量,你不能给他重新赋值,但是没说不能修改其属性啊。

final关键字:我偏不让你继承

这样就不行咯!

所以,final修饰了这个变量,他的地址就被定死了,不能改了。

顺便说一下,构造方法是不能修饰构造方法的。

6. 课后作业

1、下列关于final关键字的描述,正确的是( )

A. final关键字可用来修饰方法

B. final关键字可用来修饰类

C. 声明为final的方法不能被重写

D. final修饰的方法可以被private修饰符修饰

final关键字:我偏不让你继承