详解final关键字的常见四种用法

final关键字代表最终,不可改变的,常见四种用法:
1:可以用来修饰一个类;
2:可以用来修饰一个方法;
3:可以用来修饰一个局部变量;
4:可以用来修饰一个成员变量。

1:可以用来修饰一个类;

/*
当final关键字用来修饰一个类的时候
格式:
public final class 类名称{
    //.....
}
含义:当前这个类不能有任何的子类(也称为太监类)
一个类如果是final类,那么其中所有的成员方法都无法进行覆盖重写(因为不能被继承),
但是final可以有父类,可以覆盖重弄父类中的成员方法
 */
public final class MyClass /*extends Object*/ {

    public void method(){
        System.out.println("方法执行!");
    }
}

public class MySubClass /*extends MyClass*/ {//会报错,final修饰的类不能被继承
}

2:可以用来修饰一个方法;

/*
当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。
格式:
修饰符  final  返回值类型  方法名称(参数列表){
    //方法体
}

注意事项:
对于类,方法来说,abstract关键字与final关键字不能同时使用。
原因:abstract修饰的方法在被非抽象类继承的时候,该方法必须被覆盖重写,而被final修饰的方法为
      最终方法,不能被覆盖重写,互相矛盾。
 */
public abstract class Fu {

    public final void method(){
        System.out.println("父类方法!");
    }

}


public class Zi extends Fu {

    //会报错,不能覆盖重写父类中final修饰的方法
   /* @Override
    public void method(){
        System.out.println("覆盖重写父类中的method方法!");
    }*/
}

3:可以用来修饰一个局部变量;

public class Demo01Fianl {

    public static void main(String[] args) {
        int num1 = 10;
        System.out.println(num1);//10
        num1 = 20;
        System.out.println(num1);//20

        //一旦使用final用来修饰局部便令,那么这个变量就不能进行修改,一次赋值,终生不变。
        final int num2 = 100;
        System.out.println(num2);//100

        //num2 = 200;//报错,用final修饰的局部变量不能被重新赋值,只能进行唯一一次的赋值

        final int num3;
        num3 = 100;

        //对于基本类型来说,不可变说的是变量当中的数据不可以改变
        //对于引用类型来说,不可变说的是变量当中的地址值不可改变
        Person p1 = new Person("李四", 20);
        System.out.println(p1);//cn.itcast.DemoDay07.Person@7b23ec81
        System.out.println("我叫"+p1.getName()+",今年"+p1.getAge()+"岁");//我叫李四,今年20岁

        p1 = new Person("张三",30);
        System.out.println(p1);//cn.itcast.DemoDay07.Person@17a7cec2
        System.out.println("我叫"+p1.getName()+",今年"+p1.getAge()+"岁");//我我叫张三,今年30岁
        System.out.println("=====================================");

        //用final关键字进行修饰
        final Person p2 = new Person("王五", 100);
        System.out.println(p2);//cn.itcast.DemoDay07.Person@65b3120a
        System.out.println("我叫"+p2.getName()+",今年"+p2.getAge()+"岁");//我叫王五,今年100岁

        //错误写法,final的引用类型变量,其中的地址不可改变,要想变化可以通过其中的getXXX,setXXX方法进行秀修改
        //p2 = new Person("赵六",200);

        p2.setName("XXX");
        p2.setAge(200);
        System.out.println(p2);//cn.itcast.DemoDay07.Person@65b3120a,地址没有发生变化
        System.out.println("我叫"+p2.getName()+",今年"+p2.getAge()+"岁");//我叫XXX,今年200岁

    }
}

4:可以用来修饰一个成员变量。

1.用于成员变量具有默认值,所以用了final之后必须进行手动赋值,不能再给默认值了
2.对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
3.必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。
 */
public class Student {
    
    private final String name;//这里是通过构造方法进行赋值的

    public Student() {
        this.name = "XXX";
    }

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43751200/article/details/107502259