修饰符

1 访问修饰符

  • private:仅对本类可见
  • public:对所有类可见
    • 接口里方法默认 public
  • protected:对本包和所有子类可见
  • default:对本包可见

一个方法可以访问所属类的所有对象的私有对象

2 非访问修饰符

2.1 final

  • final 域(常量)
    • final 域必须显式指定初始值,赋值后,不能被重新赋值。
    • 基本类型:final 使数值不变
    • 引用类型:final 使引用不变,但是被引用的对象本身是可以修改的
  • final 方法
    • final 方法可以被子类继承,但是不能被子类修改。
    • private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。
  • final 类
    • final 类不能被继承

2.2 static

  • 静态域(变量)
    • 类变量,多实例也只有一份拷贝
  • 静态常量
    • 多与 final 组成静态常量,一般大写
  • 静态方法
    • 类方法,独立于对象,没有隐式参数 this 和 super,可以访问静态域
    • 不可从一个 static 方法内部发出对非 static 方法的调用
    • 必须有实现,不能是抽象方法
  • 静态内部类
    • 只有内部类能被声明为 static。
    • 静态内部类不能访问外部类的非静态的变量和方法。
  • 静态代码块
    • 静态块在类加载时自动执行
  • 静态导包
    • JDK 1.5,用 import static 代替 import 静态导入,可以直接使用类的静态方法和静态域,而不需要使用类名作为前缀。

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

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

2.3 abstract

  • 抽象类
    • 抽象类不能实例化,唯一目的是为了对该类进行扩充。
    • 抽象类可以不包含抽象方法。
  • 抽象方法
    • 抽象方法是一种没有任何实现的方法,具体实现由子类提供。
    • 任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
    • 包含抽象方法的类,一定要声明为抽象类。

2.4 synchronized

  • 方法
  • 代码块
    • synchronized 声明的方法同一时间只能被一个线程访问。

2.5 transient

  • transient 变量
    • 序列化时被跳过

2.6 volatile

volatile 同步变量

  • 原子性:不保证
  • 可见性:保证,读写立刻与主内存交换
  • 有序性:保证,禁止指令重排序优化
Author: iMine
Link: https://imine141.github.io/2020/08/19/Java%E5%9F%BA%E7%A1%80/%E5%AF%B9%E8%B1%A1%E4%B8%8E%E7%B1%BB/%E4%BF%AE%E9%A5%B0%E7%AC%A6/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.