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 + '\'' +
                    '}';
        }
    }
}
posted @   haveanicedayfh  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示