final

方法里面的变量不能用static修饰,不能用访问修饰符修饰。

final用法,用于某些不能修改的变量。且必须给他一个初始值,不能是别的值。
被final修饰的变量成为一个全局常量,全局的意思是在所有方法里面引用这个都可以,常量是说值不能改变。但是注意,我们说全局常量,首先你是一个成员变量才可以,如果是局部变量不能变成全局的,只能是不可修改的。

static,不是全局的,是属于类的,属于类是属于所有对象的。

public static final int i=1;
为什么要static和final一起使用?
使用final之后这个值不能改,就算new多少个对象也一样,值不变。既然值不变,为什么还要加上一个static修饰呢?因为使用static修饰调用方法,直接类调用。

简单来说,final强调这个值不能被修改,static强调这个属于类,调用方便。

final修饰的成员变量是什么时候被加载的呢?
是在new对象的时候,
在这里插入图片描述

在这里插入图片描述

程序执行的时候,先执行test4的无参构造,但是没有执行无参,而是跑到final那里加载变量。

new对象家final有啥用?

===========================================
final可以用来修饰局部变量,成员变量,方法,类。
final修饰局部变量,这个变量就成了常量。局部变量可以不被赋值,但是赋值只能赋值一次。但是使用范围依然只有这个方法
final修饰成员变量,必须在初始时候就被赋值否则报错。
final修饰的成员变量和普通成员变量唯一区别就是这个变量不可以被修改,其余的还是属于对象,所有对象都有一个这个变量。

final修饰对象的作用?

final修饰方法,代表这个方法不能被修改,比如父类方法加了final之后,子类不能重写这个方法。

final修饰类,这个类不能被继承。

再次强调一点:
重写是子父类继承,覆盖也是子父类继承,重载是一个方法名字一样但是参数返回值等有区别。

final修饰的变量,基本类型的话,指的是这个变量的值不能改变。
引用类型,那么这个引用类型的地址不能改变,地址不变的意思是保证这个地址永远指向这一个对象,也就是确定了对象一致。但是对象里面的内容是可以改变的。

这个代码执行的很有意思。Test2在被加载的时候,先加载a和b,可以加载a的时候b没有被加载,我们不能直接写a=b,这样报错。所以间接的写a=fun fun=b。代码执行顺序先加载a,然后执行fun方法,但是fun方法返回的是b,而b没有被加载,因此b是默认值。因此a=0
然后加载b,b=2;

在这里插入图片描述

使用final的风险:stackOverFlowError
在这里插入图片描述
final有一个特性,这个特性就是被final修饰的成员变量是在new对象的时候被加载的,并且在执行构造之前被加载。
也就是说如果这个变量 i指向一个新的对象,程序执行一个新的构造方法,但是在执行之前又看见这个对象有final方法,又会跑到final里面执行i。结果又看见i指向了一个新的对象,这个新的对象又有自己的final修饰的i,i又指向新的对象,新的对象又有i。
每一次都产生新的对象,用于不会执行构造,栈针永远不会出栈,栈内存溢出。

解决这个问题加上static,
在这里插入图片描述
加载static为什么不会重复new对象呢?不会无限次数的调用构造呢?
因为加上static的属性不再堆内存中,不是对象属性了。不是对象属性意味着对象没有这个属性,对象只有构造方法,因此属性被final修饰不会程序不会调到final,被final修饰的只有对象属性才会跳转。因此执行构造!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值