您的位置:首页 > 编程语言 > Java开发

Java中final关键字的作用

2017-03-13 15:50 274 查看


final的作用随着所修饰的类型而不同

 

final在Java中表示的意思是最终,也可以称为完结器。可以使用final关键字声明类、属性、方法,在声明时需要注意以下几点:

(1)使用final声明的类不能有子类。

(2)使用final声明的方法不能被子类所覆写。

(3)使用final声明的变量即成为常量,常量不可以修改。

 

具体分析:

 1、final修饰类中的属性或者变量

     无论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的“值”不能变。

     这个值,对于基本类型来说,变量里面放的就是实实在在的值,如1,“abc”等。

     而引用类型变量里面放的是个地址,所以用final修饰引用类型变量指的是它里面的地址不能变,并不是说这个地址所指向的对象或数组的内容不可以变,这个一定要注意。

             

  例如:

       类中有一个属性是    final Person p=new Person("name"); 

      那么你不能对p进行重新赋值,但是可以改变p里面属性的值,p.setName('newName');

       final修饰属性,声明变量时可以不赋值,而且一旦赋值就不能被修改了。对final属性可以在三个地方赋值:声明时、初始化块中、构造方法中。总之一定要赋值。      

         

  2、final修饰类中的方法

          作用:可以被继承,但继承后不能被重写。

      

   3、final修饰类

           作用:类不可以被继承。

   

 思考一个有趣的现象:

        byte b1=1;

        byte b2=3;

        byte b3=b1+b2;       //当程序执行到这一行的时候会出错,因为b1、b2可以自动转换成int类型的变量,运算时Java虚拟机对它进行了转换,结果导致把一个int赋值给byte-----出错

       

    如果对b1 b2加上final就不会出错:

       

     final byte b1=1;

       final byte b2=3;

       byte b3=b1+b2;//不会出错,相信你看了上面的解释就知道原因了。

 

要想理解这个问题,先来看看下面这道问题:

java中: 

            byte b = 2; 

            b = 3+7;      //执行正确 

但是 

             byte b = 2; 

             byte b1 = 3;

             byte b2 = 7;

             b = b1+b2;   //执行错误

 

何解?????

 

 b = b1+b2;错误  是因为byte与byte数据相加,数据自动转换为int型,所以byte
b= b1+b2肯定不对了啊.需要类型强制转换,byte b=(byte)(b1+b2)

追问:

    你的意思应该是int型赋给byte会损失精度报错,对吗? 但,
byte b=2; b=3+7; 3、7也是int型,相加后仍是int型,编译时未报错

追答:

    int型赋给byte会损失精度报错,这句话是对的。但后面的3、7也是int型就不对了,因为byte的取值范围是-128~127
,那么这个3,7判定是什么类型,就不确定了,比如byte
b =3;int b=3;long b=3L,这都可以正常编译,原因是它会根据这个数值所在范围,3明显在
-128~127 这个范围内,这个判定依据是前面的符号。如果byte b=3,它就会占2个字节。而int
b=3,它就会占4个字节。long b=3L,它就占8个字节。

追问:

    java中, 整数默认情况下是 int型 ,小数默认情况下是double型,例:
float i=3.13;//3.13就是double型 必须后加f ,即
float i=3.13f;否则报错

追答:

    你说的是对的,但是你需要知道java里的数据类型还不够。你学过c把,我把它们之间的区别说一下,尽量说详细些,以后你碰到这种问题就不会有这种疑问了。
Java中表达式中char、byte、short类型计算时会自动先转换成int型,即两个byte型相加生成的是int型变量。有以下定义byte
b1 = 1,b2 = 2,b3;要将b3赋值成b1和b2的和,必须写成b3
= (byte)(b1 + b2);因为b1+b2是int型的,不强制转换类型编译器会报错。 而C中则不会将char、byte、short类型自动转换成int型。
Java中常数(即字面值)中,整数是默认int型的,小数是默认double型的。char、byte、short变量可以直接赋值成整数,不改变类型,而long变量赋值时要加上后缀l,float变量赋值小数时要加上后缀f(float赋值不加后缀会报错)。例如long
t1 = 20l;float f1 = 2.3f; C++中的类型转换则不是很严格;

追问:

    谢谢,你说的我明白了 byte b=2; b=3+7;执行正确是因为: 虽然3+7的和是int,但10是常量且在-128~127间,因而赋值给byte不会造成数据的遗失
而 byte b=2; byte b1=3,b2=7; b=b1+b2;编译报错是因为:
b1、b2是变量,在某些情况下如
b1=127;b2=127;和是int型,但和254不在-128~127间,因而
赋值给byte会造成数据的丢失,是这样理解的吗?

追答:

    差不多就是这样理解的。因为一个变量你不能确定它的值是多少。在这里虽然byte b1=3,b2=7;但我可以在后面让b1=127;b2=127,那么b=b1+b2;不是就超出byte范围了吗。所以java里2个byte相加自动转换为int型就是这个考虑。而int型转为byte需要强制转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java