java接口的修饰符可以为final,java语言中,final修饰符的特点有哪些

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: