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.println("========静态内部类========");
}
public void InnerMethod( {
System.out.println("========静态内部方法======");
}
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会对方法、变量及类进行优化。
附,类初始化顺序:
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类普通变量
父类普通代码块
父类构造函数
子类普通变量
子类普通代码块
子类构造函数