final
1. 数据
- 对于基本类型,final使数值不变
- 对于引用类型,final是引用不变,也不能引用其他对象,但是被引用的对象本身是可以修改的
final int i = 0;
// i = 1; The final local variable i cannot be assigned.
final FinalA finalA = new FinalA();
finalA.j = 1;
- 对于类的成员变量,必须赋予初始值
- 对于局部变量,不用必须赋予初始值
class FinalA {
// final int i; The blank final field i may not have been initialized
int j;
void fun() {
final int i;
}
}
2. 方法
声明方法不能被子类重写。
private方法隐式地被指定为final,如果在子类中定义的方法和父类中 一个private方法签名相同,此时子类的方法不是重写父类方法,而是在子类中定义了一个新的方法。
3. 类
声明类不能被继承。
static
1. 静态变量
- 静态变量:又称类变量,这个类是属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存中只存在一份。
- 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
2. 静态方法
静态方法在类加载的时候就存在了,它不依赖任何实例。所以静态方法必须有实现,也就是它不能是抽象方法。
只能访问所属类的静态字段和静态方法,方法中不能有this和super关键字。
静态方法不会被重写。
class A {
public static void fun() {
System.out.println("A : fun()");
}
public static void fun1() {
System.out.println("A : fun1()");
}
}
class B extends A {
public static void fun() {
System.out.println("B : fun()");
}
public static void main(String[] args) {
A.fun(); // A : fun()
B.fun(); // B : fun()
A.fun1(); // A : fun1()
B.fun1(); // A : fun1()
}
}
3. 静态语句块
静态语句块在类初始化时运行一次。
4. 静态内部类
非静态内部类依赖外部类的实例,而静态内部类不需要。
5. 静态导包
在使用静态变量和静态方法时不需要在指明ClassName
import static com.xxx.ClassName.*
6. 初始化顺序
静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。
实例变量和普通语句块的初始顺序取决于它们在代码中的顺序。
如果静态变量定义在静态语句块后,在静态语句块里只能对它赋值,不能访问它;实例变量和普通语句块也是同样的道理。
class ReferenceFieldBeforeDefinedTest {
{
j = 3; // 可以赋值
// System.out.println(j); Cannot reference a field before it is defined
System.out.println(i); // 普通语句块可以访问到静态变量,可能是因为它在静态变量初始后
}
static {
i = 2; // 可以赋值
// System.out.println(i); Cannot reference a field before it is defined
}
private static int i = 1;
private int j = 2;
public static void main(String[] args) {
System.out.println(ReferenceFieldBeforeDefinedTest.i);
ReferenceFieldBeforeDefinedTest referenceFieldBeforeDefinedTest = new ReferenceFieldBeforeDefinedTest();
System.out.println(referenceFieldBeforeDefinedTest.j);
}
}
0
0
0
存在继承的情况下,初始化顺序为:
- 父类(静态变量、静态语句块)(和顺序有关)
- 子类(静态变量、静态语句块)(和顺序有关)
- 父类(实例变量、普通语句块)(和顺序有关)
- 子类(实例变量、普通语句块)(和顺序有关)
- 父类(构造函数)
- 子类(构造函数)