关于Final

Final修饰的基本数据类型.

     1、所有的byte,short,char型的值将被提升为int型;

     2、如果有一个操作数是long型,计算结果是long型;

     3、如果有一个操作数是float型,计算结果是float型;

     4、如果有一个操作数是double型,计算结果是double型;

     5、被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化;

浅谈final关键字

1)修饰类

  当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

 在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

2)修饰方法

早期的final修饰方法,会将方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌带来调用的任何提升性能提升,在最近的Java版本中,不在用final方法进行优化了。

3)修饰变量

修饰变量是final用的最多的地方--对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

4)被final修饰的引用变量指向的对象内容是否可变(可变)

public class Test {

    public static void main(String[] args)  {

        final MyClass myClass = new MyClass();

        System.out.println(++myClass.i);

    }

}

class MyClass {

    public int i = 0;

}

 这段代码可以顺利编译通过并且有输出结果,输出结果为1。这说明引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。

5)final和static

  很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变。看下面这个例子:

public class Test {

    public static void main(String[] args)  {

        MyClass myClass1 = new MyClass();

        MyClass myClass2 = new MyClass();

        System.out.println(myClass1.i);

        System.out.println(myClass1.j);

        System.out.println(myClass2.i);

        System.out.println(myClass2.j);

    }

}

class MyClass {

    public final double i = Math.random();

    public static double j = Math.random();

}

 运行这段代码就会发现,每次打印的两个j值都是一样的(因为static会静态装入,一开始就把值初始化进去了),而i的值却是不同的(final引用对象的内容是可变的,所以i的值是可以改变的)。从这里就可以知道final和static变量的区别了。

6)线程和final的安全性

         含有final域的对象,JVM必须保证对对象的初始引用在构造函数之后执行,不能乱序执行(out of order),也就是可以保证一旦你得到了引用,final域是完成了初始化的,也就是书中所说的“初始化安全性”的保证,这样一来保证例如在线程数量不一致的时候,去访问某个领域,会出现“不安全发布的问题”。

 

总结:因为对象的领域使用了final保证了构造函数初始化的一致性,就使得程序变得安全(在线程和程序启动方面)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、小H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值