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需要强制转换。