Java 关键字 static final

1. static

1.1 static 的基本概念

static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。
----《Java编程思想》P86

简单来说就是:方便在没有创建对象的情况下来进行调用(方法/变量)。
即:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。
1.2 static 的用法

  • static 关键字修饰类(只有内部类可以被 static 修饰)
public class StaticTest {
    	//static关键字修饰内部类
    	public static class InnerClass{
    		InnerClass(){
    			System. out . pr intnc("========静态内部类========");
    		}
    		public void InnerMethod( {
    			System. out.pr intln("========静态内部方法======");
    		}
    		public static void main(String[] args) {
    			//直接通过StaticTest类名访问静态内部关InnerClass
    			InnerClass inner=new StaticTest.InnerClass();
    			//静态内部类可以和普通关一样使用
    			inner.InnerMethod();
    		}
    	}
    /*输出是
    *========静态内部类========
    *========静态内部方法==========
    */
  • static 关键字修饰方法

    • static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问
    • 在静态方法中不能访问类的非静态成员变量和非静态成员方法
    • 非静态成员方法中是可以访问静态成员方法/变量
    • 静态成员方法可以调用静态成员方法
  • static 关键字修饰变量

    • static 变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
    • static 成员变量的初始化顺序按照定义的顺序进行初始化。
  • static 关键字修饰代码块

    • 静态代码块在类初次加载时执行,只执行一次
    • 用来形成静态代码块以优化程序性能

2. final

2.1 final 的基本用法

  • final 关键字修饰变量

    • 用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。
    • 同时使用static和final修饰的成员在内存中只占据一段不能改变的存储空间。
  • final 关键字修饰方法参数

public class FinalTest {
    /* ... */
    public void finalFunc(final int i, final Value value) {
        // i = 5; 不能改变i的值
        // value = new Value(5); 不能改变v的值
        value.v = 5; // 可以改变引用对象的值
    }
}
class Value {
    int v;
    public Value(int v) {
        this.v = v;
    }
}
  • final 关键字修饰方法

    • 方法前面加上final关键字,代表这个方法不可以被子类的方法重写
    • final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定
    • 类中所有的private方法都隐式地指定为是final的
  • final 关键字修饰类

    • 使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承
    • final类中的所有成员方法都会被隐式地指定为final方法
    • Java中有许多类是final的,譬如String, Interger以及其他包装类

2.2 final 关键字的好处

  • final关键字提高了性能。JVM和Java应用都会缓存final变量。
  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
  • 使用final关键字,JVM会对方法、变量及类进行优化。

附,类初始化顺序:

父类静态变量

父类静态代码块

子类静态变量

子类静态代码块

父类普通变量

父类普通代码块

父类构造函数

子类普通变量

子类普通代码块

子类构造函数

猜你喜欢

转载自www.cnblogs.com/huaranmeng/p/12595659.html