day11 final 修饰符的使用规则

   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;   //不可被二次赋值更改的参数. 错误!

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值