一、访问权限修饰符

子类 任意
public
protected
[default]
private

二、abstract修饰符

abstract可以用来修饰类或者方法。被abstract修饰的类为抽象类,被abstract修饰的方法为抽象方法。

抽象类一般会包含抽象方法(也可以不包含)且不能被实例化。抽象方法一定位于抽象类中(也可位于接口中),抽象方法不能有实现,需由子类继承重写实现(接口中的抽象方法从java8开始可以有默认的实现)

接口中的方法都是public abstract修饰,字段都是public static final 修饰

三、final修饰符

  • final修饰的不能被继承。

  • final修饰的方法不能被子类重写。private 方法隐式地被指定为 final。如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法

  • final修饰的字段

    基本类型:final 使数值不变。

    引用类型:引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。

四、static修饰符

1. 静态变量

  • 静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。

  • 实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。

2. 静态方法

静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法,方法中不能有 this super 关键字。

3. 静态语句块

静态语句块在类初始化时运行一次。

1
2
3
4
5
6
7
8
9
public class Test {
    static {
        System.out.println("123");
    }
    public static void main(String[] args) {
        Test t1 = new Test ();
        Test t2 = new Test ();
    }
}

4. 静态内部类

非静态内部类依赖于外部类的实例,而静态内部类不需要。静态内部类不能访问外部类的非静态的变量和方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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. 初始化顺序

静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。存在继承的情况下,初始化顺序为:

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