Java 复习笔记(三) - 转自 廖雪峰的 Java 教程
继承
子类自动获得了父类的所有字段,严禁定义与父类重名的字段!
继承有个特点,就是子类无法访问父类的private 字段或者 private 方法。
protected 关键字可以把字段和方法的访问权限控制在继承树内部,一个 protected 字段和方法可以被其子类,以及子类的子类所访问。
super
super
关键字表示父类(超类)。子类引用父类的字段时,可以用 super.fieldName
。
任何 class
的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句 super();
。这是父类是无参构造方法的情况,如果是有参构造,需要携带相关字段,比如 super(name, age)
。
向上转型和向下转型
子类对象可以向上转型为父类对象,多余的功能可以丢弃掉;但父类对象强转为子类对象可能会失败,因为子类功能比父类多,缺少的部分不能凭空变出来。
instanceof
可以判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。如果一个引用变量为 null
,那么对任何instanceof
的判断都为 false
。
继承总结
继承是面向对象编程的一种强大的代码复用方式;
Java 只允许单继承,所有类最终的根类是 Object;
protected 允许子类访问父类的字段和方法;
子类的构造方法可以通过 super() 调用父类的构造方法;
可以安全地向上转型为更抽象的类型;
可以强制向下转型,最好借助 instanceof 判断(针对向上转型后的变量,可以通过判断并强转,排除其他情况);
子类和父类的关系是 is,has 关系不能用继承。
方法重载(Overload)与方法覆写(override)
方法重载发生在同一类中,出现了多个方法名相同、参数不同的方法,这个用法叫重载。方法重载的返回值类型通常都是相同的。
而方法覆写存在于继承关系中,子类中定义了一个与父类完全相同(方法名、参数、返回值类型都相同)的方法,这种用法叫覆写。
[notice]方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。[/notice]
Java 的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型,这个特性叫多态(polymorphic
)。多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。
final
final 修饰的字段表示初始化后不可被修改,修饰的方法表示该方法不可被覆写,修饰的类表示该类不可被继承。
抽象类
只有在抽象类中才可以声明抽象方法,否则所在类无法编译。
面向抽象编程本质:
- 上层代码只定义规范(例如:abstract class Person);
- 不需要子类就可以实现业务逻辑(正常编译);
- 具体的业务逻辑由不同的子类实现,调用者并不关心。
总结:
通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;
定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;
如果不实现抽象方法,则该子类仍是一个抽象类;
面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。