Java 关键字 final

关键字 final
final 关键字最普通的意思就是表明“某一个部分是不能改变的”。之所以要禁止改变,主要有两个方面的考录:效率和稳定。 final在Java中可以修饰成员数据、方法 和类。

一 . final数据
数据的恒定不变是很有用的,它能够减轻系统运行时的负担。对于这些恒定不变的数据我可以叫做“常量”。“常量”主要应用与以下两个地方:

1、编译期常量,永远不可改变。
2、运行期初始化时,我们希望它不会被改变。

对于编译期常量,它在类加载的过程就已经完成了初始化,所以当类加载完成后是不可更改的,编译期可以将它代入到任何用到它的计算式中,也就是说可以在编译期执行计算式。当然对于编译期常量,只能使用基本类型,而且必须要在定义时进行初始化。

有些变量,我们希望它可以根据对象的不同而表现不同,但同时又不希望它被改变,这个时候我们就可以使用运行期常量。对于运行期常量,它既可是基本数据类型,也可是引用数据类型。基本数据类型不可变的是其内容,而引用数据类型不可变的是其引用,引用所指定的对象内容是可变的。

通过以下代码加深理解和印象
首先创建一个A类:

public class  A {

    private String name;

    A(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

创建一个FinalTest.java类:

public class FinalTest {

    private final String final_01 = "final_01";    //编 译期常量,必须要进行初始化,且不可更改
    private final String final_02;                 //构造器常量,在实例化一个对象时被初始化


    private static Random random = new Random();               //通过随机数进行常量的赋值
    private static final int final_03 = random.nextInt(50);    //使用随机数对静态常量进行初始化


    private  final int final_04 = random.nextInt(50);    //使用随机数对非静态常量进行初始化

    //引用
    public final A final_05 = new A("引用常量");    //final指向引用数据类型

    public FinalTest(String final_02){
        this.final_02 = final_02;
    }

    public String toString(){
        return "final_01 = " + final_01 +
                "   final_02  = " + final_02 +
                "   final_03 = " + final_03 +
                "   final_04 = " + final_04 ;
    }
}

调用代码:

FinalTest final1 = new FinalTest("第一次创建对象");
System.out.println(final1);
FinalTest final2 = new FinalTest("第二次创建对像");
System.out.println(final2);

运行结果:

I/System.out: 
final_01 = final_01   
final_02  = 第一次创建对象   
final_03 = 24   
final_04 = 23   

I/System.out: 
final_01 = final_01   
final_02  = 第二次创建对像   
final_03 = 24   
final_04 = 11   

final_01编译期定义好
final_02在构造其中进行赋值
final_03 = 24 是静态常量,在运行期随机赋值一次,在下一次创建对象的时候直接使用,不会改变
final_04 是非静态常量,只是赋值一次之后不能再对其进行赋值,但是每次创建的值不同。

二、final 方法
所有被 final 标注的方法都是不能被继承、更改的,所以对于 final 方法使用的第一个原因就是方法锁定,以防止任何子类来对它的修改.

父类:Parent 定义 final 方法 finalParent();

public class Parent {

    public final void finalParent(){

    }

}

子类Child无法重写finalParent方法。

public class Child extends Parent {
     //错误提示 overridden mothed is final  
    public void finalParent(){

   }
}

三、final 类
如果某个类用 final 修改,表明该类是最终类,它不希望也不允许其他来继承它。在程序设计中处于安全或者其他原因,我们不允许该类存在任何变化,也不希望它有子类,这个时候就可以使用 final 来修饰该类了。

对于 final 修饰的类来说,它的成员变量可以为 final,也可以为非 final。如果定义为 final,那么 final 数据的规则同样适合它。而它的方法则会自动的加上 final,因为 final 类是无法被继承,所以这个是默认的。

四、final 参数
在实际应用中,我们除了可以用 final 修饰成员变量、成员方法、类,还可以修饰参数、若某个参数被 final 修饰了,则代表了该参数是不可改变的。

final 修饰参数在内部类中是非常有用的,在匿名内部类中,为了保持参数的一致性,若所在的方法的形参需要被内部类里面使用时,该形参必须为 final.具体的内部类的final 参数在内部类中分析。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值