继承

子类自动获得了父类的所有字段,严禁定义与父类重名的字段!

继承有个特点,就是子类无法访问父类的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)

方法重载发生在同一类中,出现了多个方法名相同、参数不同的方法,这个用法叫重载。方法重载的返回值类型通常都是相同的。

而方法覆写存在于继承关系中,子类中定义了一个与父类完全相同(方法名、参数、返回值类型都相同)的方法,这种用法叫覆写。

方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。

Java 的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型,这个特性叫多态(polymorphic
)。多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。

final

final 修饰的字段表示初始化后不可被修改,修饰的方法表示该方法不可被覆写,修饰的类表示该类不可被继承。

抽象类

只有在抽象类中才可以声明抽象方法,否则所在类无法编译。

面向抽象编程本质:

  • 上层代码只定义规范(例如:abstract class Person);
  • 不需要子类就可以实现业务逻辑(正常编译);
  • 具体的业务逻辑由不同的子类实现,调用者并不关心。

总结:

通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;

定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;

如果不实现抽象方法,则该子类仍是一个抽象类;

面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。

摘自:Java 教程 - 廖雪峰