首页 > 其他分享 >以不变应万变:final关键字和不变形

以不变应万变:final关键字和不变形

时间:2024-03-04 21:59:12浏览次数:26  
标签:int final 关键字 线程 修饰 以不变应万变 public 赋值

以不变应万变:final关键字和不变形

目录

什么是不变形(Immutable)

  • 如果对象在被创建后,状态就不能被修改,那么它就是不可变的。

    • 例如:person对象,age和name都不能再变
    • 具备不变性的对象一定是线程安全的,我们不需要对其采取任何额外的安全措施,也能保证线程安全。
public class Person {
    public final int age = 18;
    public final String name = "Alice";

}

在其他类中,只可以读取,而不可以赋值。

/**
 * 测试final能否被修改
 */
public class TestFinal {
    public static void main(String[] args) {
        Person person = new Person();
        person.age = 178;
    }
}

final的作用

3种用法:修饰变量、方法、类

image-20240304210643231

  • 属性被声明为final后,该变量则只能被赋值一次。且一旦被赋值,final的变量就不能再被改变,如论如何也不会变。

赋值时机

image-20240304210833041

public class FinalVariableDemo {
    private final int a;

    /**
     * 构造函数中赋值
     * @param a
     */
    public FinalVariableDemo(int a){
        this.a = a;
    }
	
    // 代码块中赋值
    {
        a=7;
    }
    
}

image-20240304211059738

public class FinalVariableDemo {
    // 第一种,等号后面赋值
    private static final int a;

 
	// 第二种:静态代码块赋值
    static {
        a=7;
    }

}

image-20240304211601613

public class FinalVariableDemo {
//    private static final int a;


    void testFinal(){
        final  int b;
        b = 5;
        int c = b;
    }



}

注意点

final修饰方法

  • 构造函数不 允许final修饰

  • 不可被重写,也就是不能被override,.即便是子类有相同名字的方法,那也不是override,这个和static方法是一个道理。

  • 引申:static方法不能被重写

final修饰类

  • final修饰类不可被继承,例如典型的String类就是final

总结

  • final修饰对象的时候,只是对象的引用不可变,而对象本身的属性是可以变化的
  • final使用原则:良好的编程习惯

不变性和final的关系

  • 不变形并不意味着,简单地用final修饰是不可变。
    • 对于基本数据类型
  • 如何利用final实现对象不可变?<不对>

总结出,满足以下条件时,对象才是不可变的

  • 对象创建后,其状态就不能改变
  • 所有属性都是final修饰的
  • 对象创建过程中没有发生溢出

把变量写在线程内部——栈封闭

  • 在方法里新建的局部变量,实际上是存储在每个线程私有的栈空间,而每个栈的占空间是不能被其他线程所访问到的,所以不会有线程安全问题。这就是著名的“栈封闭”技术,是“线程封闭”技术的一种情况。

标签:int,final,关键字,线程,修饰,以不变应万变,public,赋值
From: https://www.cnblogs.com/shine-rainbow/p/18052798

相关文章

  • C# new 关键字用法
    试题回答参考思路:一,用法总结:在c#中,new关键字可用作运算符,声明修饰符,约束。1)new运算符:new运算符创建类型的新实例,调用构造函数(如果继承了基类,同时会调用基类的构造函数)。2)new声明修饰符:2.1)在用作声明修饰符时,new关键字可以显式隐藏从基类继承的成员。派生类成员变量被new关键字......
  • JAVA面向对象基础:this关键字
    this;this就是一个变量,可以用在方法中,来拿到拿到当前对象   this的应用场景:this主要用来解决变量名称冲突问题的。   this真正解析: ......
  • C++系列:const关键字
    前言在学习C++时,const关键字的知识点分散在书的各个章节。当我们尝试在编程时使用const时,总会感觉有一些细节被遗忘,因而不能得心应手地使用const关键字。因此,本篇文章尝试着对const关键字的做一些总结。参考书籍《C++PrimerPlus》const总结这里是我做的关于const关键字的一些......
  • void关键字
    #include<iostream>//void关键字代表空,可以用作函数前声明返回值类型,代表无返回值//例如:voidfun(){}//可以放在函数的形参位置代表不需要参数voidfun(void){}//*****主要是第三种,void*放在形参位置用于接收任意类型的指针。//但是解引用的时候必须强制转换为明确的......
  • 4_C# 中的 ref 关键字有什么作用
    C#中的ref关键字有什么作用?参数在使用ref关键字进行引用传递时,必须在方法调用之前对其进行初始化。ref关键字既可以在进入方法之前初始化参数的值,也可以在方法内部对参数进行修改。ref参数在进入方法时保持原始值,并在方法结束后将值带回到调用处。ref关键字的作用:......
  • 2_virtual关键字的作用
    virtual作用?virtual关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写(使用override关键字对虚方法重写)。如下是虚方法声明和重写虚方法的示例:声明虚方法publicclassAnimal{publicvirtualvoidSpeak(){Console.WriteLine("动......
  • Volatile关键字原理
    转载请标明:https://www.cnblogs.com/tangZH/p/15113505.html一、如果一个变量被volatile关键字修饰,那么所有线程都是可见的。所谓可见就是,当一条线程修改了这个变量值,新值对于其他线程来时是立即可见的; 而普通变量不能做到这一点。 1、现在计算机缓存架构:  CPU与内存之......
  • 简单实现new关键字,及为什么当result为对象则返回这个对象?
    下面是一个简单的JavaScript代码示例,演示了如何手动实现new关键字的功能:functionmyNew(constructor,...args){//创建一个新对象,该对象继承自构造函数的原型varinstance=Object.create(constructor.prototype);//在新对象上调用构造函数,并传入参数var......
  • JAVA基础:引用类型参数传递的相关案例(数组的传递) 方法重载 return关键字
    packagecom.itheima.Method;publicclassMethod6{publicstaticvoidmain(String[]args){int[]arrs=newint[]{2,5,6,4};printArray(arrs);}publicstaticvoidprintArray(int[]arr){if(arr!=null){System.out......
  • JUC系列之(二)volatile关键字
    volatile关键字-内存可见性引出内存可见性问题的示例:packagecom.atguigu.juc;publicclassTestVolatile{publicstaticvoidmain(String[]args){//线程threadDemo修改共享变量的值ThreadDemothreadDemo=newThreadDemo();newThrea......