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 关键字后就不能被重写了。
-------------本文结束感谢您的阅读-------------