flink源码学习笔记1——final关键字

什么是final关键字

final关键字的n大用法

1.final修饰类

final类不能被继承。一般用于工具类时,同时把工具类构造函数声明为私有,暴露静态共有方法

2.final修饰方法

作用在方法上可以保证该方法不能被重写

3.final修饰变量(常量)

static final String

在flink代码中可以看到有大量的String被修饰成static final的形式:

public class CliFrontend {

    // actions
    private static final String ACTION_RUN = "run";
    private static final String ACTION_RUN_APPLICATION = "run-application";
    private static final String ACTION_INFO = "info";
    private static final String ACTION_LIST = "list";
    private static final String ACTION_CANCEL = "cancel";
    private static final String ACTION_STOP = "stop";
    private static final String ACTION_SAVEPOINT = "savepoint";

同样都是定义初始化String,用static final 修饰与直接new一个String,orString string=“ ”,这三种String初始化的方式有什么区别呢。

1.先看String string=“run”;这种方法:
使用直接赋值后,只要是以后声明的字符串内容相同,则不会再开辟新的内存空间。对于String的以上操作,在java中称为共享设计。这种设计思路是,在java中形成一个字符串对象池,在这个字符串对象中保存多个字符串对象,新实例化的对象如果已经在池中定义了,则不再重新定义,而从池中直接取出继续使用。 String就是因为采用了这样的设计,所以当内容重复时,会将对象指向已存在的实例空间。
一个双引号包含字符串就是一个String类的匿名对象,但是这种方式使用String不一定创建新对象。在执行到这个字符串的语句时,如String a = “run”,JVM会先到常量池里查找,如果有的话返回常量池里的这个实例的引用,否则的话创建一个新实例并置入常量池里。

2.String string=new String(run);
使用new关键字,不管如何都会再开辟一个新的空间。
new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间)!

字符串池的优缺点
  字符串池的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串池的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低。

3.使用static final 关键字修饰
首先使用直接赋值的字串的方式,字符串会在编译期生成在字符串池中。
然后final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
用static标志属于类的成员,类的成员是被储存在堆内存里面的。 一个类中,一个static变量只会有一个内存空间,即使有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。
static修饰的String,会在堆内存中复制一份常量池中的值。所以调用 static final String 变量,实际上是直接调用堆内存的地址,不会遍历字符串池中的对象,节省了遍历时间。

4.final修饰参数

主要分两种情况:
第一,用final修饰基本数据类型;
第二,用final修饰引用类型。
第一种情况,修饰基本类型(非引用类型)。这时参数的值在方法体内是不能被修改的,即不能被重新赋值。否则编译就通不过。

    static void test2(final int i){
        i=10;
    }

第二种情况,修饰引用类型,这时可以改变值,但是不能重新赋值,引用类型变量所指的引用是不能够改变的,但是引用类型变量的值是可以改变的

    static void test(final A a){
            a.a=123;//可以修改
            a.string+="56789";//可以修改
            a=new A();//会报错
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值