Java final修饰符使用总结

总:final修饰符可以修饰变量、方法、类。

一:final修饰的成员变量。


final修饰的成员变量被赋初始值后,就不可以再次被赋值。

java规定final修饰的成员变量必须显示初始化。类变量是在类准备阶段被系统分配内存,并赋默认值,在初始化阶段为类变量进行初始化,赋初始值。实例变量是通过new关键字调用构造器时创建一个实例,系统为实例的实例变量分配内存,并赋默认值,然后执行初始化,并赋初始值。当类变量或实例变量没有初始化语句时,成员变量的值只是默认值,根据成员变量的类型,成员变量的值可能是null或者0等,这样final变量就没有任何意义。

类变量的初始化语句是定义这个变量时给定的初始值或在静态代码块中执行类变量的初始化,所以final修饰的类变量必须在定义这个变量时,或者静态代码中显示初始化。
实例变量的初始化语句时定义这个变量时给定初始值或在普通初始化块、构造器中执初始化,所以fianl修饰的变量初始化必须在定义这个变量时制定初始值或着在普通初始化块、构造器中显示初始化。

代码演示:
public class Test {
     // 定义变量时制定初始化值
     final String f = "你好";
     static final String w = "大家好" ;
     // final修饰的变量必须显示初始化
     static final int a;
     final int b ;
     final int c ;
     // 在静态代码块中初始化
     static {
           a = 100;
           // 静态代码块中不能初始化实例变量
           // b=15;
     }
     // 在普通代码块中初始化
     {
           b = 100;
     }

     // 在构造器中初始化
     public Test( int c) {
           this.c = c;
     }

     // 成员变量只能在以上几个地方执行初始化,所以final修饰的变量只能在这几个地方初始化
     // 初始化结束,这些语句将不会再执行
     public static void main(String args[]) {
           // final修饰的变量第一次被赋初始值后,不可以再改变
           // 为final变量再次赋值,将出现错误。
           // Test.a=1000;
          Test test = new Test(80);
          System. out.println(test.c );
           // 为final修饰的实例变量再次赋值,将出现错误
           // test.c=60;

     }

}


二:final修饰的局部变量

局部变量原本就必须要显示初始化,形参除外,final修饰的局部变量也是这样。局部变量必须显示初始化,可以在定义的时候不指定初始值,在局部变量范围类再制定初始值,当还没制定初始值时,不可以使用局部变量,final修饰的局部变量也是如此。final修饰的形参不可以被赋值,因为形参是根据传入的值由系统初始化;

代码演示:
public class Test {
     int a;

     // final修饰的形参不可被赋值
     public Test( final int a) {
           // final修饰的形参不可以被赋值,由系统根据传入的参数由系统初始化
           // a=5;

     }

     public void test() {
          {
               // final修饰的局部变量可以不再定义局部变量时制定初始值
               final int c;
               // final修饰的局部变量还没有指定初始值时不可以使用出现错误
               // System.out.println(c);
              c = 100;
               // 赋初始值后不可以在赋值,否则将出现错误
               // c=200;
          }
     }
}



三:final修饰的引用类型变量

final修饰的引用类型变量,保存的是实例的地址,实例地址不可以改变,但是对象的状态信息可以改变。

代码演示:
class Person {
     int a = 10;
}

public class TestOne {
     int a = 10;
     // 定义一个final修饰的Person实例
     final Person p = new Person();

     public static void main(String args[]) {
          TestOne test = new TestOne();
           // final修饰的实例是引用类型变量p,保存的是地址,所以地址不可以改变,出现错误。
           // test.p=new Person();
           // final修饰的实例是引用类型变量p,保存的是地址,地址不可以改变,实例的状态信息可以改变
           // 输出final修饰的实例,引用类型变量p的状态信息a,输出10
          System. out.println(test.p .a );
           // 改变p的状态信息
          test. p. a = 100;
           // 输出a,发现状态信息变啦
          System. out.println(test.p .a );

     }

}


:宏变量

定义final修饰的变量时直接指定初始值,在编译期间可以确定初始值,就是宏变量,系统在编译期间会将后面程序用到这个宏变量的地方全部替换成该变量的值。
编译期可以确定初始值的条件:1:定义这个final变量时值是直接量。2:定义final变量时指定的初始值时表达式,这个表达式是基本算术表达式或字符串连接运算,不访问基本变量和方法。

代码演示:
public class TestTwo {
     public static void main(String args[]) {
           // 初始值为直接量则为宏变量
           final int a = 10;
           // 字符串连接运算的值可以在编译期确定,为宏变量
           final String w = "" + "" ;
           // 基本算术表达式的值可以在编译期确定,为宏变量
           final int b = 5 + 4;
           // 隐式调用方法不影响编译期得到值,这个String字符串会被存到常量池,
           // 当后面程序再次使用到这个字符串,会直接引用常量池中这个字符串
           final String f = "" + 5;
           // 下面用String变量证明一下
          String g = "5";
          System. out.println(f == g);
     }
}


五:final修饰的方法

final修饰的方法不可被重写
代码演示:

class Father {
     // 父类中被final修饰的方法
     public final void test() {

     }
}

public class Son extends Father {
     // final修饰的方法不可以被重写,重写出现错误
     // public void test(){

     // }

}


六:final修饰的类不可被继承
例如:java.lang.Math  java.lang.String 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值