自学Java之day11_java关键字final

原文链接:www.baidu.com

final关键字的概述

学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承 API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java提供了 final 关键字, 用于修饰不可改变内容。

final关键字常见的四种用法

常见四种用法:

  • 可以用来修饰一个类
  • 可以用来修饰一个方法
  • 还可以用来修饰一个局部变量
  • 还可以用来修饰一个成员变量

修饰一个类

含义:当前这个类不能有任何的子类。一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写。final类可以覆盖重写其父类中的方法。

格式:

final class 类名 {

        //方法体

}

例如:

public final class MyClass /*extends Object*/ {
    public void method() {
        System.out.println("我是一个final类");
    }
}

修饰一个方法

含义:当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。

格式:

修饰符 final 返回值类型 方法名(参数列表){

            //方法体

}

例如:

public class Fu {
    public final void method(){
        System.out.println("此方法是被final修饰,无法被覆盖重写");
    }
}

注意事项:

  • 对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。

修饰成员变量

基本类型的局部变量,final修饰后,只能赋值一次,不能再更改。一次赋值,终生不变

例如:

public class FinalDemo1 {
    public static void main(String[] args) {
        // 声明变量,使用final修饰
        final int a;
        // 第一次赋值
        a = 10;
        // 第二次赋值
        a = 10; // 报错,不可重新赋值
        // 声明变量,直接赋值,使用final修饰
        final int b = 10;
        // 第二次赋值
        b = 20; // 报错,不可重新赋值
    }
}

引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改

例如:

定义Person类

public class Person {
    private String name;

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

    public Person() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

定义测试类

public class FinalDemo02 {
    public static void main(String[] args) {
        // 创建被final 修饰的对象
        final Person person = new Person("张三");
        //内存地址不可改变,妹new一次就是创建一个新的对象,内存地址不同
        //person = new Person("李四");错误
        //输出对象的成员变量name的值
        System.out.println(person.getName());
        //改变对象的成员变量name的值
        person.setName("李四");
        //输出对象的成员变量name的值
        System.out.println(person.getName());
    }
}

代码执行后的结果

修饰成员变量

对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。

注意

  • 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了。
  • 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
  • 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。

例如

直接赋值

// 显示初始化;直接赋值
public class User {
    final String USERNAME = "张三";
    private int age;
}

构造方法赋值


//构造方法初始化。构造方法进行赋值
public class Student {
    //被final修饰的常量名称,一般都有书写规范,所有字母都大写。
    final String USERNAME;
    private int age;

    public Student(String username, int age) {
        this.USERNAME = username;
        this.age = age;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章