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 同步变量
- 原子性:不保证
- 可见性:保证,读写立刻与主内存交换
- 有序性:保证,禁止指令重排序优化