继承与多态
类的定义
- 先定义变量
- 后定义方法
- 公有方法
- 保护方法
- 私有方法
- getter/setter方法
继承
就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接 访问父类中的非私有的属性和行为。
class 父类 { ... }class 子类 extends 父类 { ... }
继承后的特点
- 成员变量
- 成员方法
- 构造方法
super与this
- super :代表父类的存储空间标识(可以理解为父亲的引用)。
- this :代表当前对象的引用(谁调用就代表谁)。
子类默认的空构造方法默认调用super(), 也就是父类的默认构造函数, 如果父类没有无参构造函数, 则编译会出错. 这个时候需要手动调用父类的构造函数()
class Father{ public Father(int i) {}}class Son extends Father{ public Son(){ super(1); }}
如果用this()或者super() 调用构造器, 则必须在构造函数内的第一行调用(必须保证父类在子类之前初始化)
特点
- 单继承
- 多层继承
抽象类
- 抽象方法 : 没有方法体的方法。
- 抽象类:包含抽象方法的类。
public abstract class Animal { public abstract void run(); }
接口
接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么 接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法 (JDK 9)
public interface 接口名称 { // 抽象方法 // 默认方法 // 静态方法 // 私有方法 }class 类名 implements 接口名 { // 重写接口中抽象方法【必须 // 重写接口中默认方法【可选】 }
默认方法
public interface LiveAble { public default void fly(){ System.out.println("天上飞"); } }
静态方法
public interface LiveAble { public static void run(){ System.out.println("跑起来~~~"); } }
私有方法
- 私有方法:只有默认方法可以调用。
- 私有静态方法:默认方法和静态方法可以调用。
多实现
class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... { // 重写接口中抽象方法【必须】 // 重写接口中默认方法【不重名时可选】 }
- 如果默认方法有重名的,必须重写一次。
抽象类与接口
抽象类是is-a关系, 是模板式设计 接口是 can-do关系, 是契约式设计
优先定义接口, 避免直接使用继承
多态
父类类型 变量名 = new 子类对象; 变量名.方法名();
多态的好处
final关键字
- 修饰类 表明该类是无法继承的
- 修饰方法 表明该方法是无法覆写的
- 修饰局部变量 说明该变量在声明的时候,就必须初始化完成,而且以后也不能修改其内存地址
- 修饰成员变量 同上
访问权限控制
访问权限控制符 | 任何地方 | 包外子类 | 包内 | 类内 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | × | √ | √ | √ |
default | × | × | √ | √ |
private | × | × | × | √ |
- 不允许从外部创建对象时 使用private修饰构造方法
- 工具类不允许有public 或 default 构造器
- 成员变量非static 需要与子类共享 必须为protected
- 成员变量非static 仅在内部使用 使用private
- static成员变量 仅在内部使用 使用 private
- 定义static成员变量时 考虑加final修饰
- 成员方法 仅在内部使用 使用private
- 成员方法仅对继承类公开 使用 protected