面向对象(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
posted @ 2021-12-11 20:03  阿伟宝座  阅读(90)  评论(0)    收藏  举报