Java学习笔记63——final关键字

2021/12/11 1:18:35

本文主要是介绍Java学习笔记63——final关键字,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

final关键字

我们如果说父类的东西不想让子类去继承:
可以使用private修饰或者static

由于继承方法中有一个现象:方法重写
所以,当方法可以被重写的时候,父类原本的方法还在,但是调用是子类重写后的
方法,如果我依旧想保留父类原本的方法,不想让子类重写,但是呢,我想让子类去用

针对于这样的情况,java提供了一个关键字:final

定义

final: 最终的意思,不可以改变的意思。

使用格式

一般情况下,把final放在访问权限修饰与返回值之间
常见的情况下,final不仅可以修饰成员方法,也可以修饰类,变量

class Father4{
    //被final修饰的成员方法,不能被子类重写。
    public final void fun(){
        System.out.println("这是父类的fun方法");
    }
}

class Son4 extends Father4{
//    public void fun(){
//        System.out.println("这是父类的fun方法");
//    }

}


public class ExtendsDemo6 {
    public static void main(String[] args) {

    }
}

final:最终的意思,它可以修饰变量,类,方法

特点:

1、被final所修饰的类无法被其他类所继承

//被final修饰的类不能被继承
final class Fu1{

}

class Zi1 extends Fu1{

}

public class FinalDemo1 {
    public static void main(String[] args) {
        
    }
}

2、被final修饰的方法,子类无法重写,但是在同一个类中可以出现同名不同参数列表的被final修饰的方法,这是重载

class Fu1{
    public final void fun1(){
        System.out.println("这是父类中的fun1方法");
    }
    public final void fun1(String s){
        System.out.println("这是父类中的fun1方法");
    }
}

总结一句话:被final修饰的方法不能被重写,但是可以被重载

3、被final修饰的变量变成了常量,无法再重新分配值。

class Fu1{
    public final void fun1(){
        System.out.println("这是父类中的fun1方法");
    }
    public final void fun1(String s){
        System.out.println("这是父类中的fun1方法");
    }
}

class Zi1 extends Fu1{
    final int a=10; //被final修饰的变量变成了常量,无法再重新分配值。
    
    public void fun2(){
        System.out.println("a:"+a);
    }
}


public class FinalDemo1 {
    public static void main(String[] args) {
        Zi1 zi1 = new Zi1();
        zi1.fun2();
        zi1.a=200;
        zi1.fun2();//报错

    }

}

常量
A: 字面值常量:
10,12.34,"hello",'a',true

​ B: 自定义常量
​ 其实就是被final修饰的变量。
​ final int a = 10;

注意:被final修饰变量,只要在构造方法完毕之前赋值就可以了。下面是两种赋值途径

class Fu2{
   
    final int b;

    Fu2(){
        b = 30;//构造方法完毕前赋值
        System.out.println(b);
    }
}

public class FinalDemo3 {
    public static void main(String[] args) {
 
    }
}
class Fu2{
    
    final int b;

    {
        b = 100;//构造代码块赋值
    }

    Fu2(){
        System.out.println(b);
    }
}

public class FinalDemo3 {
    public static void main(String[] args) {
   
    }
}

4、被final修饰的局部变量是基本数据类型的时候,不可以修改值

public class FinalDemo2 {
    public static void main(String[] args) {
        int a=10;
        System.out.println(a);
        a=100;
        System.out.println(a);
        final int b=20;
        System.out.println(b);
        b=200;//b被final修饰,所以不可以重新赋值
        System.out.println(b);//报错
    }
}

5、被final修饰的局部变量是引用数据类型的时候,该对象的地址值是无法改变的, 但是引用堆内存中的变量是可以发生改变。

class Student {
    int age = 18;
}


public class FinalDemo2 {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println(s1.age);
        final Student s2 = new Student();
        System.out.println(s2.age);
        //s2 = s1;报错。被final修饰的局部变量s2是引用数据类型,地址值无法改变
        s2.age = 20;//age并没有被final修饰,所以可以改变
        System.out.println(s2.age);
    }
}


这篇关于Java学习笔记63——final关键字的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程