【Java基础】关键字

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

存在继承的情况下,初始化顺序为:

  • 父类(静态变量、静态语句块)(和顺序有关)
  • 子类(静态变量、静态语句块)(和顺序有关)
  • 父类(实例变量、普通语句块)(和顺序有关)
  • 子类(实例变量、普通语句块)(和顺序有关)
  • 父类(构造函数)
  • 子类(构造函数)

参考

猜你喜欢

转载自blog.csdn.net/qq_21687635/article/details/89668504
今日推荐