各修饰符final ,static的使用

时间:2021-07-15 21:09:04

final

有三种使用场景,分别是修饰变量方法类,无论哪种修饰,一旦声明为final类型,你将不能改变这个引用了,编译器会检查代码,如果你试图再次初始化,编译器会报错

1、修饰变量 
当final修饰一个变量的时候一般把他作为常量,通常和static关键字配合使用。例如: 
private static final String ISSUCCESS_FLAG = “true”;一般static修饰的常量都用大写字母来表示。

String str1 = "12";
final String str2 = "1";
String str3= "1";
boolean a=(str1==(str2+"2"));
boolean b=(str1==(str3+"2"));
这里a和b的值分别是什么? 
显然a=true,b=false 
此时str2+”2”其实就是”1”+”2”操作的是常量之间的连接操作,而str3+”2”其实是new String(“12”);他和str1是两个对象,内存地址不同
2、修饰方法 
当一个方法被final修饰后,表示该方法不能被子类重写,final方法有一个好处是比非final方法要快,因为在编译时已经静态绑定了,不需要在运行时在动态绑定。 
3、修饰类 
当一个类被final修饰后,表示该类是完整的,不能被继承,例如Java中String、Integer类都是final类 

final修饰的优点

  • final关键字提高了性能。JVM和Java应用都会缓存final变量。
  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
  • 使用final关键字,JVM会对方法、变量及类进行优化。
  • 不可变类创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。
   接口不能被final修饰,没有意义。

  java接口可以是public 的,也可以是friendly的,但一定是abstracted的。

  java接口里的方法只能是public的、abstract的。

  java接口里的成员变量只能是public 的,static 的,final的;并且必须赋初值,否则通不过编译。

    static 关键字

  1. 用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
  2. 用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
  3. 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
  4. 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。

public class TestStatic {
    public static void main(String[]args){
        System.out.println(S.getStatic());//使用类名加前缀访问静态方法
        S s=new S();
        System.out.println(s.getStatic());//使用实例化对象名访问静态方法
        System.out.println(s.get());
    }
    public static class S
    {
        private static int a;
        private int t=0;

        //静态初始器:由static和{}组成,只在类装载的时候(第一次使用类的时候)执行一次,往往用来初始化静态变量。
        static{
            a=10;
        }

        //静态方法只能访问静态数据成员
        public static int getStatic()
        {
            return a;
        }

        public int getT()
        {
            return t;
        }

        //非静态方法可以访问静态方法和非静态方法
        public int get()
        {
            getT();
            getStatic();
            t=a;//非静态方法可以访问非静态数据成员和静态数据成员
            return t;
        }
    }
}

如上图所示:

各修饰符的作用域如下:其中默认修饰符在子类中可以访问,在不同包中不能访问

各修饰符final ,static的使用