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

 

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

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

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

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

 

具体分析:

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

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

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

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

             

例如:

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

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

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

         

、final修饰类中的方法

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

      

、final修饰类

作用:类不可以被继承。

   

思考一个有趣的现象:

        byte b1=1;

        byte b2=3;

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

       

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

       

     final byte b1=1;

       final byte b2=3;

不会出错,相信你看了上面的解释就知道原因了。

 

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

java中: 

            byte b = 2; 

执行正确

但是

             byte b = 2; 

             byte b1 = 3;

             byte b2 = 7;

执行错误

 

何解?????

 

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

追问:

型赋给byte会损失精度报错,对吗? 但, byte b=2; b=3+7; 3、7也是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个字节。

追问:

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

追答:

里的数据类型还不够。你学过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++中的类型转换则不是很严格;

追问:

执行正确是因为: 虽然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会造成数据的丢失,是这样理解的吗?

追答:

但我可以在后面让b1=127;b2=127,那么b=b1+b2;不是就超出byte范围了吗。所以java里2个byte相加自动转换为int型就是这个考虑。而int型转为byte需要强制转换。