0%

Java 类的继承(二):继承的细节

1. 子类可以通过 super 调用父类的构造方法,如果子类没有通过 super 调用,则会自动调用父类的默认构造方法。那如果父类没有默认构造方法呢

  • 如果父类只有带参的构造方法,没有默认构造方法,这个时候,它的任何子类都必须在构造方法中通过 super 调用父类的带参的构造方法。否则,Java 会提示编译错误。
  • 创建子类对象都要必须从父类开始,从调用父类构造方法开始,严格按照继承关系创建子类对象。

2. 子类和父类的实例变量、静态方法和静态变量可以重名吗。如果重名,访问的是哪一个呢

  • 重名是可以的,重名后实际上有两个变量或方法
  • private 变量和方法只能在类内访问,访问的也永远是当前类的。即:在子类中访问的是子类的;在父类中访问的是父类的。它们只是碰巧名字一样而已,没有任何关系
  • public 变量和方法,则要看如何访问它在类内,访问的是当前类的,但子类可以通过 super. 明确指定要访问的是父类的。在类外,则要看访问变量的静态类型:静态类型是父类,则访问父类的变量和方法;静态类型是子类,则访问的是子类的变量和方法。

3. 怎么理解静态绑定

  • 静态绑定,即访问绑定到变量的静态类型
  • 静态绑定在程序编译阶段即可决定,而动态绑定则要等到程序运行时。
  • 实例变量、静态变量、静态方法、private 方法,都是静态绑定的

4. 重载和重写的区别

  • 重载:指方法名称相同但方法签名不同(参数个数、类型、顺序)。
  • 重写:子类覆盖与父类相同方法签名的方法,然后重新实现。

5. 访问重载方法时的顺序

  • 当有多个重名方法的时候,在决定要调用哪个方法的过程中,首先是按照参数类型进行匹配。
  • 即:寻找在所有重载版本中最匹配的,然后才看变量的动态类型,进行动态绑定。

6. 向上转型是多态,那可以进行向下转型吗

  • 语法上可以进行强制类型转换,但不一定能转换成功。有可能在运行时抛出类型转换异常的错误。
  • 一个父类的变量能不能转换为一个子类的变量,取决于这个父类变量的动态类型(即引用的对象类型)是不是这个子类或这个子类的子类。
  • 没有多态就不能向下转型

7. instanceof 关键字的作用

 经常用于判断一个父类的变量是不是某个子类的对象,从而安全地进行类型转换

8. 修饰符 protected 的作用范围

  • 被子类访问。
  • 被同一个包中的其他类访问,不管其他类是不是该类的子类

9. 怎样理解模板方法这个设计模式

  • 模板方法这个设计模式是利用 protected 修饰符的一种思路和设计。父类定义了实现的模板,而具体实现则有子类提供。
  • 即:子类对象调用父类的模板方法,模板方法内再调用具体的子类的方法实现

10. 怎么理解可见性重写

  • 重写方法时,一般并不会修改方法的可见性。
  • 如果重写时,子类方法不能降低父类方法的可见性,否则会有编译错误。
  • 继承反映的是 “is-a” 的关系,即子类对象也属于父类,子类必须支持父类所有对外的行为,将可见性降低就会减少子类对外的行为,从而破坏 “is-a” 的关系,但子类可以增加父类的行为所以提升可见性是没有问题的。
  • 子类可以对父类扩大版图而不是相反

11. final 关键字修饰类和方法的含义是

  • 一个 Java 类,默认情况下都是可以被继承的,但加了 final 关键字之后就不能被继承了
  • 一个非 final 的类,其中的 public/protected 实例方法默认情况下都是可以被重写的,但加了 final 关键字后就不能被重写了
-------------------- 本文结束感谢您的阅读 --------------------