day11 final 修饰符的使用规则

  • Post author:
  • Post category:其他


   Final --- 最终且不可改变的

Fianl关键字常见4个用法:


1/修饰类


作用:该类不可以有子类,不可以被继承,但是该类可以继承其它类(包括默认的原生父类Object).

注意:如果有定义抽象类的’abstract’修饰符,则两者无法同时使用,因为矛盾

格式:public fianl class 类名


2/修饰方法


作用:假如有子类,该方法将不能被重写

注意:如果有定义抽象方法的’abstract’修饰符,则两者无法同时使用,因为矛盾

格式:修饰符 fianl 返回值类型 方法名(参数列表){] 列如:public fianl void fianlMethod(){}


3/修饰局部变量


作用:变量的数据内容将不能被更改,一次赋值,终生不变

注意:1/方法中的参数也算作局部变量,因此方法中的参数变量也可以修饰成final,这意味着参数变量在接收到了参数数据后,参数内容将不会被改变.

2/变量分为’基本数据类型’和’引用数据类型’,‘对象’算是一种’引用数据类型’,因此也可以修饰对象这种引用数据类型.


2/对于基本数据类型来说,’不可变’的是数据内容. 对于引用数据类型来说,’不可变’的是地址值.


格式一/单纯修饰:final 变量类型 变量名; 或 final 变量类型 变量名 = 内容;

格式二/方法参数修饰:方法名(final 参数类型 参数名){} 列如: public final void finalMethod(final int a,final int b){


格式三/修饰’引用数据类型’之一的’对象’: final 类名 对自定义对象名 = new 类名();


4/修饰成员变量


作用:一次性,不可改变

注意:1/当fianl修饰成员变量时,不能将值留空(不带fianl则可以)

2/赋值方式有二种,要么直接赋值.要么通过构造方法赋值,二者必须选其一,不能共用!

3/如果使用构造方法赋值,那么所有的构造方法都必须对具有final属性的成员变量赋值,少一个都不行.

而仅仅一个构造方法对其进行赋值的话,那么就会报错.

public class Demo01Final {

    //==========final修饰时,成员变量直接赋值
//    private final String fianlString;         × final做修饰符时,不可以留空值,需要直接赋值
    private final String fianlString;   //√

    //=========final修饰时,通过构造方法赋值

    public Demo01Final() {
        this.fianlString = "13";              //如果使用构造方法,必须保证所有构造方法都对fianl成员变量进行赋值.
        System.out.println(this.fianlString);
    }

    public Demo01Final(String fianlString) {
        this.fianlString = fianlString;
        System.out.println(this.fianlString);
    }

    public String getFianlString() {
        return fianlString;
    }



    public static void main(String[] args) {

        System.out.println();
        finalMethod(12,21);
//=========================================================对于 基本数据类型来说,'不可变'的是{数据内容}=============================================
        //Final 变量
          //对于 基本数据类型 来说,'不可变'的是 {数据内容}
        final int finalVariable = 12;

//=============================================对于 引用数据类型 来说,'不可变'的是 {内存地址值}==============================================

         //普通定义一个对象 对其类的构造传递参数
        finalObjectTest commonlObj = new finalObjectTest("中国"); //此时内存分配了一个地址值
        System.out.println(commonlObj.getAnimalName());  //中国
        System.out.println(commonlObj); //输出对象地址值  code.study.day11.Demo01.finalObjectTest@3f3afe78
           //通过此前创造的对象'commonObj',为其对应的构造传递一个新参数
        commonlObj = new finalObjectTest("中国"); //尽管参数内容相同.但这属于新传递的参数,因此此时内存分配了一个新的地址值
        System.out.println(commonlObj.getAnimalName());  //中国
        System.out.println(commonlObj); //输出对象地址值  code.study.day11.Demo01.finalObjectTest@7f63425a

        //用'final'关键字定义一个对象 并给其构造传递参数
        final finalObjectTest finalObj = new finalObjectTest("究极");  //分配了一个内存地址
        System.out.println(finalObj.getAnimalName()); //究极
        System.out.println(finalObj);// 内存地址 code.study.day11.Demo01.finalObjectTest@36d64342
//        finalObj = new finalObjectTest("究极"); //× 不可以传递新的参数!尽管参数内容一致,但是地址值会是新的,而final对于引用数据来说,是不可以改变内存地址的!



    }
//=================================================fianl方法相关==============================================
    // 1/final定义的方法属性
    // 2/final定义的参数变量属性
    public static final void finalMethod(final int a,final int b){
        System.out.println(a+b);

       // a = 12;   //不可被二次赋值更改的参数. 错误!

    }

}



版权声明:本文为chinatopno1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。