1. 定义类
[修饰符] class 类名{ 零到多个构造器定义... 零到多个成员变量... 零到多个方法... }
1.1 定义构造器
[修饰符] 构造器名(形参列表){ // 构造器名必须与类名相同 // 由零到多条可执行语句组成 }
2. 修饰符
2.1 修饰符适用范围
外部类/接口 | 成员属性 | 方法 | 构造器 | 初始化块 | 成员内部类 | 局部成员 | ||
public | √ | √ | √ | √ | √ | |||
protected | √ | √ | √ | √ | ||||
包访问 | √ | √ | √ | √ | O | √ | O | |
private | √ | √ | √ | √ | ||||
abstract | √ | √ | √ | |||||
final | √ | √ | √ | √ | √ | |||
static | √ | √ | √ | √ | ||||
strictfp | √ | √ | √ | |||||
synchronized | √ | |||||||
native | √ | |||||||
transient | √ | |||||||
volatile | √ | |||||||
default | √ | |||||||
相同颜色不能同时出现(或同时出现无意义(灰色)) |
2.2 修饰符使用详情
类(class)([12] [~34]) | 方法([1234] [~5] [~67]) | ||||
public | 可被所有类使用(需类名与文件名相同) | public | 4.全局范围内可被访问 | ||
default(空) | 只能被相同包的其它类访问 | protected | 3.可以被不同包的子类访问 | ||
abstract | 抽象类, 不能创建实例, 只能作为父类 | default(空) | 2.可被相同包的其它类访问 | ||
final | 将无法被作为父类 | private | 1.只能在当前类内部被访问 | ||
成员变量([1234] [~5] [~6]) | [1] static | 无此修饰, 则只能通过实例来调用 | |||
public | 4.全局范围内可被访问 | abstract | 含抽象方法的类只能被定义成抽象类 | ||
protected | 3.可以被不同包的子类访问 | final | 子类不允许覆盖父类的final方法 | ||
default(空) | 2.可被相同包的其它类访问 | 构造器(没有返回值声明) | |||
private | 1.只能在当前类内部被访问(常) | public | 4.全局范围内可被访问(常) | ||
[1] static | 通过其修饰, 可通过类或实例调用 | protected | 3.可以被不同包的子类访问 | ||
final | 不允许为final变量重新赋值 | default(空) | 2.可被相同包的其它类访问 | ||
初始化块{} (在执行构造器之前执行) | private | 1.只能在当前类内部被访问 | |||
static | (不能对实例变量初始化)在类初始化阶段执行, 而不是创建对象时执行. | private修饰此类所有构造器, 子类将无法调用该类构造器, 从而无法继承. 此类将不能直接创建实例, 但可通过创建一个(public static 类 方法)来返回实例并加以控制(P174) | |||
default(空) | |||||
static修饰的方法中不能使用this引用, 所以static修饰的方法不能访问不使用static修饰的普通成员 | |||||
内部类([1234] [~5] [~67]) |
final修饰的成员变量必须显式地指定初始值. (1.类变量: 必须在静态初始化模块中或声明该类变量时指定初始值; 2.实例变量: 必须在非静态初始化模块、声明该实例变量或构造器中指定初始值) |
||||
public | 4.全局范围内可被访问 | ||||
protected | 3.可以被外部类不同包的子类访问 | ||||
default(空) | 2.可被外部类相同包的其它类访问 | ||||
private | 1.只能在当前外部类内部被访问 | ||||
static | 非静态内部类不能拥有静态成员 | final修饰局部变量可以在声明时指定, 也可以在后面的代码中赋初始值, 但只能一次. | |||
abstract | 抽象类, 不能创建实例, 只能作为父类 | ||||
final | 将无法被作为父类 | final修饰形参, 形参会在调用该方法时由系统根据传入的参数来完成初始化, 因此不能被赋值 | |||
接口里定义内部类默认使用public static修饰 | |||||
局部内部类(方法中定义)不能使用访问控制修饰符 | final 修饰引用变量时只保证变量引用的地址不变 | ||||
所有局部变量不能使用static修饰 | abstract修饰的类只能被继承abstract不能和static/private同时修饰某个方法 | ||||
匿名内部类: new 实现接口() | 父类构造器(实参) {} | |||||
匿名内部类适合创建那种只需要使用一次的类 | abstract修饰的方法被定义时没有{}, 只定义不实现abstract修饰的方法必须由子类提供实现(重写) | ||||
J8之前匿名/局部内部类只能访问final局部变量J8会自动为其访问的局部变量使用final修饰 | |||||
枚举类enum(与class, interface地位相同) | |||||
继承 | 可以实现一个或多个接口 | ||||
默认继承java.lang.Enum而不是Object,因此枚举类不能显示的继承其它父类 | |||||
Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口 | |||||
使用enume定义、非抽象的枚举类默认使用final | |||||
构造器 | 只能使用private(可省略)访问控制符 | ||||
枚举类的实例必须在枚举类第一行显示列出(‘,’隔开), 否则这个枚举类永远都不能产生实例. 列出这些实例时, 系统会自动添加public static final修饰, 无需程序员显示添加. | |||||
values()方法 | 可方便的遍历所有枚举值 |
3. 接口(定义多个类共同的公共行为规范)
[public | 空] interface 接口名 extends 父接口1, 父接口2, ... (与class不同, 接口支持多继承) | |||
一个Java源文件最多只能有一个public接口, 源文件的主文件名必须与该接口一致 | |||
接口里的成员都是public访问权限, 修饰符可省略(系统自动指定), 指定的话只能使用public | |||
成员变量 | 只能是静态常量. 总是使用public static final来修饰(可省略, 系统自动使用) | ||
方法 | 抽象实例方法 | 总是使用public abstract来修饰(可省略), 没有方法体 | |
类方法(J8) | 需要使用static修饰, 不能使用default修饰 | ||
默认方法(J8) | 需要使用default修饰, 不能使用static修饰 | ||
内部类 | 内部接口, 枚举. 总是使用public static来修饰(可省略) | ||
[修饰符] class 类名[ extends 父类] implements 接口1, 接口2, ... (接口的实现) | |||
实现接口方法 | 只能用public修饰, 因为子类重写父类方法时访问权限必须更大或相等 |