面向对象(11-2):final关键字
面向对象(11-2):final关键字
一、final关键字的介绍
1、如果父类的东西不想让子类去继承:可以使用private修饰或者static
由于继承方法中有一个现象:方法重写
所以,当方法可以被重写的时候,父类原本的方法还在,但调用的是子类重写后的方法;
如果我依旧想保留父类原本的方法,不想让子类重写,但想让子类去用
针对于这样的情况,java提供了一个关键字:final(最终的、不可改变的)
2、使用格式:一般情况下,把final放在访问权限修饰后、返回值前
常见的情况下,final不仅可以修饰成员方法,也可以修饰类,变量
案例 :
class Father4{
//被final修饰的成员方法,不能被子类重写。
public final void fun(){
System.out.println("这是父类的fun方法");
}
}
class Son4 extends Father4{
/*public void fun(){
System.out.println("这是父类的fun方法");
}
父类中方法中加了final,在子类中重写会报错
*/
}
二、final关键字的应用
特点
1、被final所修饰的类无法被其他类所继承
案例:
//创建一个父类
final class Father00{
}
下面这样写会报错
/*
创建一个子类
class Zi00 extends Father00{
}
*/
2、被final所修饰的方法,子类无法重写;
但是在同一个类中,可以出现同名不同参数列表的且被final修饰的方法,这正是重载
(即、被final所修饰的方法,可以重载,不可重写)
3、被final修饰的变量变成了常量,无法再重新分配值
常量:
A: 字面值常量:
10,12.34,"hello",'a',true
B: 自定义常量
其实就是被final修饰的变量。
final int a = 10;
三、final关键字面试题
1、final修饰局部变量
(1)被final修饰的局部变量是基本数据类型的时候,不可以修改值
(2)被final修饰的局部变量是引用数据类型的时候,该对象的地址值是无法改变的,
但是引用堆内存中的变量是可以发生改变
案例1:
public class FinalDemo2 {
public static void main(String[] args) {
//局部变量,并且a是基本数据类型
int a = 10;//将10赋值给a
System.out.println(a);//10
a = 100;//二次赋值,将100重新赋值给a
System.out.println(a);//100
//加final修饰
final int b = 100;
System.out.println(b);//100
//b = 200;前面b被final修饰,不可二次赋值,否则报错
//System.out.println(b);
//被final修饰的局部变量是基本数据类型的时候,不可以修改值(也就是不可给他进行二次赋值)
案例2:
class Student{
int age = 18;
}
public class FinalDemo2 {
public static void main(String[] args) {
//创建学生对象
Student s1 = new Student();
System.out.println(s1.age);//18
//final修饰对象
final Student s2 = new Student();
System.out.println(s2.age);//地址值无法改变,结果仍是18
s2.age = 19;
System.out.println(s2.age);//引用堆内存中的变量发生改变,结果是19
}
}
案例3:
/*
被final修饰变量,只要在构造方法完毕之前赋值就可以了
*/
class Fu2{
int a;
final int b;
{
b = 100;
}
Fu2(){
System.out.println(b);
}
public void fun1(){
a = 20;
System.out.println(a);
}
}
public class FinalDemo3 {
public static void main(String[] args) {
Fu2 fu2 = new Fu2();
fu2.fun1();
}
}
执行结果为:
100
20
Process finished with exit code 0

浙公网安备 33010602011771号