Java-16 final关键字

1.final关键字是最终的意思,可以修饰类局部变量成员变量成员方法

  1.1 修饰类:被修饰的类不能被继承,就是说这个类不能有任何的子类,也就是太监类,只能继承父类,不能被继承

    格式:publi final class 类名称{}

    注意:一个类如果为final类,那么其中所有的成员方法都不能被覆盖重写(因为没有子类)

final class He{
    public void methon(){
        System.out.println("方法块执行");
    }
}
/*  报错
class You extends He{
    
}
*/

  1.2 修饰成员方法:当final用来修饰成员方法时,这个方法就是最终方法,不能被覆盖重写

    格式:修饰符 final 返回值类型 方法名称(形参){}

class Fu{
    public final void methon(){
        System.out.println("父类方法执行");
    }
}

class Son extends Fu{
    public void methon(){
        System.out.println("子类方法执行");
    }
}

//Error:(20, 17) java: com.shujia.day1.day3.Son中的methon()无法覆盖com.shujia.day1.day3.Fu中的methon()
  被覆盖的方法为final

  1.3 修饰局部变量:一旦使用final修饰局部变量,那么这个变量就不能进行更改,一旦赋值,终生不变

//当final修饰局部变量,对于基本类型来说,不可变的是变量中的值不可变
//                     对于引用类型来说,不可变的是变量中的地址值不可变
public class FinalDemo{
    public static void main(String[] args) {
        int num1=20;
        System.out.println(num1);//20
        num1=23;
        System.out.println(num1);//23
        //正确写法
        final int num2 =20;
        System.out.println(num2);//20
//        num2=30;报错
//        num2=20;报错
        //正确写法
        final int num3;
        num3=40;
        System.out.println(num3);
       //final修饰引用数据类型
        FinalDemo6 fin = new FinalDemo6("张三");
        System.out.println(fin);//com.shujia.day1.day3.FinalDemo6@4554617c
        System.out.println(fin.name);//张三
        fin=new FinalDemo6("李四");
        System.out.println(fin);//com.shujia.day1.day3.FinalDemo6@74a14482
        System.out.println(fin.name);//李四
        System.out.println("=========================");
        final FinalDemo6 fin2 = new FinalDemo6("王五");
        System.out.println(fin2);//com.shujia.day1.day3.FinalDemo6@1540e19d
        System.out.println(fin2.name);//王五
//        fin2=new FinalDemo6("老王");错误写法,final修饰不能改变地址、
        fin2.name="老王";
        System.out.println(fin2);//com.shujia.day1.day3.FinalDemo6@1540e19d
        System.out.println(fin2.name);//老王

    }
}

  1.4 final关键字修饰成员变量:如果使用final修饰成员变量,那么这个变量也是照样看不可变,不会再给默认值,必须手动赋值

/*
使用final修饰成员变量,那么这个变量也是照样看不可变,不会再给默认值,必须手动赋值,两种方法,二者选其一
1.直接赋值
2.构造方法赋值,必须保证所有重载的构造方法都要对final修饰的成员变量进行赋值
 */
class Person{
//    构造方法赋值
    private final String name;
//    private final String name="张三"; //直接赋值
    public Person(String name) {
        this.name = name;
    }

    public Person() {
        name="张三";
    }

    public String getName() {
        return name;
    }
     //使用构造方法赋值,需要删除setter方法,不能对final修饰的成员变量重新赋值
//    public void setName(String name) {
//        this.name = name;
//    }
}

  

posted @ 2021-09-28 19:21  艺术派大星  阅读(40)  评论(0)    收藏  举报
levels of contents