Inheritance
属性
- 可继承: 公有域
- 不可继承: 私有域、静态域、实例域初始化块
- 若要访问(修改)父类私有域, 必须使用调用公有的 super.get()方法得到父类私有域
- 初始化父类私有域: super(ParamList); 调用父类构造方法进行初始化
方法
- 可继承: 公有方法
- 不可继承: 私有方法、静态方法、构造器方法
覆盖
标签相同(不可降低父类方法可见性)
重载
标签不同, 属于新加方法
super
不是隐式参数, 是提示编译器执行的特殊关键字
父类与子类的转换
Is-A 关系,
Subclass must be superclass,superclass may not be subclass.
- 可将子类引用赋值给父类变量(Upcasting)或替换父类作参数
Person p = new Student(); //p仍是父类变量
注: 若父类变量和子类变量引用同一个子类对象实例时, 父类某些操作可能引起内存混乱 例如: 先调用父类构造器方法构造子类, 再调用子类扩展方法访问子类扩展私有域(根本未分配内存空间)
- 不可将父类引用赋值给子类变量
Student s = new Person(); //ERROR:e.g. s.getStuID();
Object
Equals
- 子类中覆盖(@override)父类 equals 方法: super.equals(superClassName other);
- 显式参数名: Object otherObject
- if (this == otherObject) return true;
- if (otherObject == null) return false;
- if (getClass != otherObject.getClass()) return false;
- ClassName other = (ClassName) otherObject;
- return field == other.field
Hash Code
- String 类 hashCode:
ΣStringChar[i]^(n-i-1), (i:0~(n-1)). - Object 对象 hashCode: 内部 ID(存储地址)
- 若重写 equals 方法, 也应重写 hashCode 方法, 使对象实例 hashCode 分布散列化
- return 各域 hashCode 值加权和:31x+y rule
- 引用类型、包装类: hashCode()
- 数组: Arrays.deepHashCode()
- return Objects.hash(field1,..,fieldN); //自动组合各域 hashCode
- hash 值: return (key.hashCode() & 0x7fffffff) % M;
- return 各域 hashCode 值加权和:31x+y rule
ToString
- 设计
return getClass().getName() + "[" + field + "]"; - Object 类 toString 方法: 用于输出 ClassName 和 hashCode
- 数组直接继承 Object 类 toString 方法, 输出数组需调用 Arrays.(deep)toString();
- 自动调用: + 字符串连接符、println(obj)
访问控制符
public>protected(包作用域+)>默认(包作用域)>private(类作用域)
最大限度: 不同包的非子类(所有类)、同一个包/不同包的子类、同一个包、同一个类
abstract
abstract 方法
语法形式: abstract + MethodName(ParamList);.
abstract 类
- 定义
- 若一个类包含 abstract 方法, 则必须是 abstract 类
- 一个 abstract 类可以不包含 abstract 方法
- 一个 abstract 类可以包含具体数据和具体方法
- 构造器方法
- 需要实现构造器方法
- 构造器方法可以被非 abstract 子类调用
- 不能使用 new 构造 abstract 类对象实例
final
final 局部变量
方法内的变量: 只读常量, 必须进行一次初始化
final 实例域
- 必须进行一次(类定义/构造器)初始化
- final 引用类型实例域的引用不可更改, 但所引用对象的状态(State)可被更改
final 方法
可继承, 不可重写
final 类
- 不可继承
- 实例域可以不是 final 实例域, 方法自动成为 final 方法
static
static 实例域
类域:
- 属于类整体, 保存在类的内存区域的公共存储单元(不可继承)
- 可通过类名/对象实例名访问该属性
static 方法
- 类方法, 属于类整体(不可继承).
- 没有隐式参数(this/super).
- 只能处理该类中的 static 实例域/调用该类中的 static 方法.
- 既可通过类名调用该方法(推荐), 又可通过对象实例名调用 static 方法.
工厂模式
利用 static 方法可模拟构造器方法, 可自定义构造器名和返回对象类型.
static final 实例域
- 默认初始化(数值型为 0, 布尔型为 false, 引用型为 null)
- 常结合 public 将变量设置为全局静态常量 e.g. e、PI
接口
interface 类型是引用类型, 不能创建实例, 只能被其他类实现:
[修饰符(public)]interface 接口名 [extends 父接口名列表(多个接口)] {
//常量声明, 可为多个
[public] [static] [final] type constantName= Value;
//方法声明, 可为多个
[public] [abstract] returnType methodName( [paramList] );
}
Methods
自动默认: public abstract 方法(声明时无需关键字)
Implements
在类中必须实现(override)接口中的所有方法
方法参数
- 设计此类方法时:
- 可调用接口中公有静态常量/公有方法(interfaceVariableName.invokeMethod)
- 可将接口参数传递给其他接口作参数的方法, 调用其他方法
- 实际调用方法时: 将实现了该接口的类作为参数传递给方法, 可提高方法的灵活性
例子: Comparable 接口和 sort 静态方法
接口变量
- 不可创建 interface 实例(即不可用 new 关键字)
- 可声明一个 interface 变量, 并使其引用实现了该接口的对象实例
//TimePrinter: 实现了ActionListener接口的类
ActionListener myListener = new TimePrinter();