奇怪的Java基础知识增加了:final和static关键字

final

1.数据

对于基本类型:final修饰的变量的值被初始化后不能改变。
对于引用类型:被final修饰的引用,不能改变其引用的对象,但是可以改变引用本身的内容。

2.方法

被final修饰的方法不可以被子类重写。

private修饰的方法被隐式的指定为final,当子类的方法和父类用private修饰的方法签名相同时,不能说是子类重写了父类的方法,而是子类定义了一个新的方法。

3.类

final修饰的类不可以被继承。

static

1.静态变量

  • 静态变量又称类变量,随着类的加载而加载,所有类的实例都共享静态变量,可以通过类名.变量名称来访问。
  • 而实例变量是指每创建一个类的实例,就会产生一个实例变量。
public class Test {
	private int a = 1;//实例变量
	private static int b = 2;//静态变量
	public static void main(String[] args) {
		System.out.println(Test.a);//Cannot make a static reference to the non-static field Test.a
		System.out.println(Test.b);//2
		Test obj = new Test();
		System.out.println(obj.a);//1
	}
}

2.静态方法

  • 静态方法必须要有实现,所以该方法不能是抽象的。
  • 静态方法内部只能访问静态变量/方法,并且内部不能出现this和super关键字。

3.静态代码块

public class Test {
	//静态代码块只执行一次
    static {
        System.out.println("123");
    }

    public static void main(String[] args) {
        Test t1 = new Test ();
        Test t2 = new Test ();
    }
}
123

4.静态内部类

非静态内部类依赖于外部类的实例,所以要先创建外部类的实例,才能再创建非静态内部类的实例,而静态内部类不需要。

public class OuterClass {

    class InnerClass {
    }

    static class StaticInnerClass {
    }

    public static void main(String[] args) {
        // InnerClass innerClass = new InnerClass(); // 'OuterClass.this' cannot be referenced from a static context
        OuterClass outerClass = new OuterClass();
        InnerClass innerClass = outerClass.new InnerClass();
        StaticInnerClass staticInnerClass = new StaticInnerClass();
    }
}

5.初始化顺序

静态变量和静态方法优先于实例变量和普通语句块,静态变量和静态代码块的初始化顺序取决于它们在代码中的顺序。

public static String staticField = "静态变量";
static {
    System.out.println("静态语句块");
}
public String field = "实例变量";
{
    System.out.println("普通语句块");
}

最后才是构造函数的初始化。

public InitialOrderTest() {
    System.out.println("构造函数");
}

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

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

你可能感兴趣的:(Java基础)