java接口的修饰符可以为final,java语言中,final修饰符的特点有哪些
一、final修饰符定义:
final关键字可用于修改类、变量和方法。
当修改一个最终变量时,意味着该变量一旦获得初始值就不能改变(严格来说,最终修改的变量不能改变,一旦获得初始值,最终变量的值就不能重新赋值)
Final既可以修改成员变量(类变量和实例变量),也可以修改局部变量和参数。
相关视频学习教程:java在线学习
二、final成员变量语法规定:
final修饰的成员变量的初始值必须由程序员显式指定,系统不会隐式初始化final成员。
1.final修改的类变量和实例变量的初始值如下:
Class:初始值必须在静态初始化块中或声明class变量时指定,并且只能在两个地方之一指定。
实例变量:初始值必须在非静态初始化块、声明实例的变量或构造函数中指定,并且只能在三个地方中的一个指定。
注意:如果普通初始化块已经为某个实例变量指定了初始值,则不能再在构造器中为该实例变量制定初始值
下面的程序演示了最终修饰成员变量的效果:
包扩展;
公共类FinalVariableTest {
//定义成员变量时指定默认值,这是合法的。
final int a=6;
//以下变量将在构造函数或初始化块中被赋予初始值
最终字符串str
最终int c;
最终静态双d;
//初始化块或构造函数中既没有指定默认值,也没有指定初始值。
//下面定义的ch实例是非法的
//final char ch;
//初始化块,可以为没有默认值的实例变量指定初始值。
{
//在初始化块中为实例变量指定初始值,这是合法的。
str= Hello
//在定义实例变量时已经指定了默认值。
//A不能被重新赋值,因此下面的赋值语句是非法的。
//a=9;
}
//静态初始化块,可以指定类变量的初始值,没有默认值。
静态{
//在静态初始化块中为类变量指定初始值,这是合法的。
d=5.6
}
//构造函数,它可以指定实例变量的初始值,而无需指定默认值或初始化块中的初始值。
public FinalVariableTest() {
//如果str的初始值已经在初始化块中指定
//那么最后一个变量不能在构造函数中重新赋值,下面的赋值语句是非法的。
//str=java
c=5;
}
public void changeFinal() {
//普通方法不能给final修改的成员变量赋值。
//d=1.2
//不能在普通方法中为final成员变量指定初始值。
//ch= a ;
}
public static void mian(String[]args){
FinalVariableTest ft=new FinalVariableTest();
System.out.println(英尺. a);
System.out.println(英尺c);
System.out.println(英尺. d);}
}2.如果您打算在构造函数和初始化块中初始化最后一个成员变量,请不要在初始化之前访问成员变量的值。
包扩展;
公共类FinalErrorTest {
//定义最终修饰的实例变量
//默认情况下,不会初始化最终成员变量。
最终整数;
{
//age没有初始化,所以这里的代码会导致错误,因为它试图访问一个未初始化的变量。
//只要去掉定义年龄时的最后一个修饰符,程序就是正确的
System.out.println(年龄);
年龄=6;
System.out.println(年龄);
}
公共静态void main(String[] args){
新的finalrerrortest();
}
}三、final局部变量
1.定义:局部变量不会被系统初始化,必须由程序员显示和初始化。因此,在使用final修饰局部变量时,可以指定默认值,也可以不指定。
以下程序演示final修改局部变量和参数:
(final修改形参的情况,因为这个方法调用时初始化是系统根据传入的参数完成的,所以final修饰符不能赋值。)
包扩展;
公共类FinalLocalVariable {
公共无效测试(最终int a){
//不能给最后修改的参数赋值。以下语句是非法的。
//a=5;
}
public static void mian(String[]args){
//如果在定义最终局部变量时指定了默认值,则不能重新分配str变量。
最终字符串str= hello
//下面的赋值语句是非法的
//str= Java ;
//如果在定义最终的局部变量时没有指定默认值,D变量可以赋值一次。
最终双d;
d=5.6
//重新分配最后一个变量。以下语句是非法的。
//d=6.4;
}
}四、final修饰基本类型变量和引用类型变量的区别
不能重新分配用final修饰的引用类型变量,但是可以更改引用类型变量引用的对象的内容。
比如下面的iArr变量引用的array对象,final修改的iArr变量不能重新赋值,但是iArr引用的数组的数组元素可以改变。
例如。
//final修饰数组元素,iArr是一个引用变量。
final int[] iArr={5,6,12,9 };
system . out . println(arrays . tostring(iArr));
//对数组元素进行排序,这是合法的
arrays . sort(iArr);
system . out . println(arrays . tostring(iArr));
//将元素赋给数组,这是合法的
iArr[2]=-8;
system . out . println(arrays . tostring(iArr));
//下面的语句重新分配iArr,这是非法的。
//iArr=null;五、可执行”宏替换“的final变量
1.对于一个最终变量,无论是类变量、实例变量还是局部变量,只要变量满足三个条件,最终变量就不再是变量,而是等价于一个直接量。
(1)使用最终修改器进行装饰。
(2)初始值是在定义最终变量时指定的
(3)初始值可以在编译时确定。
2.最终修饰符的一个重要目的是定义“宏变量”。在定义最终变量的时候,指定了变量的初始值,在变量的时候就可以确定变量,那么最终变量本质上就是一个“宏变量”,编译器会直接用变量的值替换程序中所有用到变量的地方。
3、
例如。
S1=‘疯狂的Java’;
//s2变量引用的字符串可以在编译时确定。
//所以s2直接引用变量池中已有的‘疯狂Java’字符串
S2=“疯狂”“Java”;
system . out . println(S1==S2);//真
//定义两个字符串的直接数量
STR1=疯子;
String str2= Java
字符串s3=str1 str2
system . out . println(S1==S3);//false对于s3,它的值是通过str1和str2的串联运算得到的。因为str1和str2只是两个普通变量,编译器不会进行“宏替换”,所以编译器无法确定s3的值,也因此无法将s3指向字符串池中缓存的‘疯狂Java’。
更多java相关文章和教程可以访问:java入门教程以上是java面向对象final modifier的详细内容。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。