final 在 java 中有什么作用?
final修饰的常量在编译阶段会被放入常量池中。
- 修饰类:表示该类不能被继承;
- 修饰方法:表示方法不能被重写;
- 修饰变量:final修饰基本数据类型变量和引用数据类型变量。
① 当final修饰的是一个基本数据类型数据时, 这个数据的值在初始化后将不能被改变。final修饰属性可以考虑变量赋值的方式有:显示初始化、代码块中初始化、构造器初始化。修饰形参时:调用该方法时,一旦赋值形参,方法体内部不可更改其值。
② 当final修饰的是一个引用类型数据时, 也就是修饰一个对象时, 引用在初始化后将永远指向一个内存地址, 不可修改。但是该内存地址中保存的对象信息, 是可以进行修改的。
public class FinalTest {
public static void main(String[] args) {
FinalTest ft = new FinalTest();
ft.baseType(100);//形参赋值,方法体内部不能改变值:100
ft.referenceType(new StringBuilder("初始化值"));//初始化值内容变化了呀
ft.referenceType(new Stu(100, "wyb"));//Stu{id=2, name='xz'}
}
// private final int a = 1; // 赋值方式:1、显示初始化
private final int a;
/*{
a = 1; // 赋值方式:2、代码块初始化
}*/
public FinalTest() {
a = 1000; // 赋值方式:3、构造方法初始化
}
//赋值方式:4、修饰形参:调用该方法时,一旦赋值形参,方法体内部不可更改其值。
public void baseType(final int a) {
// 形参赋值不可更改其值
//a=12;
System.out.println("形参赋值,方法体内部不能改变值:" + a);
}
//赋值方式:5、final修饰的是一个引用类型数据时, 也就是修饰一个对象时,
//引用在初始化后将永远指向一个内存地址, 不可修改。但是该内存地址中保存的对象信息,
// 是可以进行修改的。
public void referenceType(final StringBuilder sb) {
sb.append("内容变化了呀");
System.out.println(sb.toString());
}
//赋值方式:5、final修饰的是一个引用类型数据
public void referenceType(final Stu stu) {
stu.id = 2;
stu.name = "xz";
System.out.println(stu);
}
public void method() {
// 局部变量
int num = 10;
num = 15;
class Inner {
public void show() {
//num = 11; // 错误。内部类中使用的外部变量num被隐式地声明为final。
}
}
}
static class Stu {
public int id;
public String name;
public Stu(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Stu{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通