侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

java面向对象之final修饰符

Java  /  管理员 发布于 8年前   173

一、final修饰符定义:

final关键字可用于修饰类、变量和方法

final修饰变量时,表示该变量一旦获得了初始值就不可被改变(严格来说:final修饰得变量不可被改变,一旦获得初始值,该final变量得值就不能被重新赋值)

final既可以修饰成员变量(类变量和实例变量),也可以修饰局部变量和形参

相关视频学习教程:java在线学习

二、final成员变量语法规定:

final修饰的成员变量必须由程序员显式地指定初始值,系统不会对final成员进行隐式处初始化。

1、final修饰的类变量、实例变量能制定初始值的地方如下:

类变量:必须在静态初始化块中指定初始值或声明该类变量时指定初始值,而且只能在两个地方的其中之一指定

实例变量:必须在非静态初始化块、声明该实例变量或构造器中指定初始值,而且只能在三个地方的其中之一指定

注意:如果普通初始化块已经为某个实例变量指定了初始值,则不能再在构造器中为该实例变量制定初始值

下面程序演示了final修饰成员变量的效果:

package lextends;public class FinalVariableTest {    //定义成员变量时指定默认值,合法    final int a = 6;    //下面变量将在构造器或初始化块中分配初始值    final String str;    final int c;    final static double d;    //既没有指定默认值,又没有在初始化块、构造器中指定初始值    //下面定义的ch实例是不合法的    //final char ch;    //初始化块,可对没有指定默认值的实例变量指定初始值    {        //在初始化块中为实例变量指定初始值,合法        str = "Hello";        //定义a实例变量时已经指定了默认值        //不能为a重新赋值,因此下面赋值语句非法        //a=9;    }    //静态初始化块,可对没有指定默认值的类变量指定初始值    static {        //在静态初始化块中为类变量指定初始值,合法        d = 5.6;    }    //构造器,可以对既没有指定默认值,又没有在初始化块中,指定初始值的实例变量指定初始值    public FinalVariableTest() {        //如果在初始化块中已经对str指定了初始值        //那么在构造器中不能对final变量重新赋值,下面赋值语句非法        //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(ft.a);    System.out.println(ft.c);    System.out.println(ft.d);}}

2、如果打算在构造器、初始化块对final成员变量进行初始化,则不要在初始化之前就访问成员变量的值。

package lextends;public class FinalErrorTest {    //定义一个final修饰的实例变量    //系统不会对final成员变量进行默认初始化    final int age;    {        //age没有初始化,所以此处代码将引起错误,因为它试图访问一个未初始化的变量        //只要把定义age时的final修饰符去掉,程序就正确了        System.out.println(age);    age=6;        System.out.println(age);    }    public static void main(String[] args){        new FinalErrorTest();    }}

三、final局部变量

1、定义:系统不会对局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。

下面程序示范了final修饰局部变量、形参:

(final修饰形参的情形,因为在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰符不能被赋值。)

package lextends;public class FinalLocalVariable {    public void test(final int a){        //不能对final修饰的形参赋值,下面语句非法        //a=5;    }    public static void mian(String[] args){        //定义final局部变量时指定默认值,则str变量无法重新赋值        final String str="hello";        //下面赋值语句非法        //str="Java";    //定义final局部变量时没有指定默认值,则d变量可被赋值一次        final double d;        d=5.6;        //对final变量重新赋值,下面语句非法        //d=6.4;    }}

四、final修饰基本类型变量和引用类型变量的区别

使用final修饰的引用类型变量不能被重新赋值,但可以改变引用类型变量所引用对象的内容

例如下面的iArr变量所引用的数组对象,final修饰后的iArr变量不能被重新赋值,但iArr所引用数组的数组元素可以被改变

eg.//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、对于一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足三个条件,这个final变量就不再是一个变量,而是相当于一个直接量。

(1)使用final修饰符修饰

(2)在定义该final变量时指定了初始值

(3)该初始值可以在编译时就被确定下来

2、final修饰符有一个重要用途就是定义”宏变量“。当定义final变量时就为该变量指定了初始值,而且该变量可以在变量时就确定下来,那么这个final变量本质上就是一个”宏变量“,编译器会把程序中所有用到该变量的地方直接替换成该变量的值。

3、

eg.String s1="疯狂Java";//s2变量引用的字符串可以在编译时就确定下来//因此s2直接引用变量池中已有的"疯狂Java"字符串String s2="疯狂"+"Java";System.out.println(s1==s2);//true//定义两个字符串直接量String str1="疯狂";String str2="Java";String s3=str1+str2;System.out.println(s1==s3);//false

对于s3而言,它的值由str1和str2进行连接运算得到的,由于str1、str2只是两个普通变量,编译器不会执行”宏替换“,因此编译器无法确定s3的值,也就无法让s3指向字符串池中缓存的"疯狂Java"。

更多java相关文章教程可以访问:java入门教程

以上就是java面向对象之final修饰符的详细内容,更多请关注其它相关文章!


  • 上一条:
    java线程中断之interrupt和stop
    下一条:
    代码讲解java的单例模式
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在java中实现的脱敏工具类代码示例分享(0个评论)
    • zookeeper安装流程步骤(0个评论)
    • 在java中你背的“八股文”可能已经过时了(2个评论)
    • 在php8.0+版本中使用属性来增加值代码示例(3个评论)
    • java 正则表达式基础,实例学习资料收集大全 原创(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2018-03
    • 2020-03
    • 2023-05
    • 2023-11
    • 2024-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客