1. 子类可以通过 super
调用父类的构造方法,如果子类没有通过 super
调用,则会自动调用父类的默认构造方法。那如果父类没有默认构造方法呢
- 如果父类只有带参的构造方法,没有默认构造方法,这个时候,它的任何子类都必须在构造方法中通过
super
调用父类的带参的构造方法。否则,Java 会提示编译错误 - 创建子类对象都要必须从父类开始,从调用父类构造方法开始,严格按照继承关系创建子类对象
2. 子类和父类的实例变量、静态方法和静态变量可以重名吗。如果重名,访问的是哪一个呢
- 重名是可以的,重名后实际上有两个变量或方法
private
变量和方法只能在类内访问,访问的也永远是当前类的。即:在子类中访问的是子类的;在父类中访问的是父类的。它们只是碰巧名字一样而已,没有任何关系public
变量和方法,则要看如何访问它。在类内,访问的是当前类的,但子类可以通过super.
明确指定要访问的是父类的。在类外,则要看访问变量的静态类型:静态类型是父类,则访问父类的变量和方法;静态类型是子类,则访问的是子类的变量和方法
3. 怎么理解静态绑定
- 静态绑定,即访问绑定到变量的静态类型
- 静态绑定在程序编译阶段即可决定,而动态绑定则要等到程序运行时
- 实例变量、静态变量、静态方法、
private
方法,都是静态绑定的
4. 重载和重写的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 不能修改 |
返回类型 | 可以修改 | 不能修改 |
异常类型 | 可以修改 | 可以减小或缩小范围,不能增加或扩大范围 |
访问限制 | 可以修改 | 可以减少限制,不能扩大限制 |
5. 访问重载方法时的顺序
- 当有多个重名方法的时候,在决定要调用哪个方法的过程中,首先是按照参数类型进行匹配
- 即:寻找在所有重载版本中最匹配的,然后才看变量的动态类型,进行动态绑定
6. 向上转型是多态,那可以进行向下转型吗
- 语法上可以进行强制类型转换,但不一定能转换成功。有可能在运行时抛出类型转换异常的错误
- 一个父类的变量能不能转换为一个子类的变量,取决于这个父类变量的动态类型(即引用的对象类型)是不是这个子类或这个子类的子类
- 没有多态就不能向下转型
7. instanceof
关键字的作用
- 经常用于判断一个父类的变量是不是某个子类的对象,从而安全地进行类型转换
8. 修饰符 protected
的作用范围
- 被子类访问
- 被同一个包中的其他类访问,不管其他类是不是该类的子类
9. 怎样理解模板方法这个设计模式
- 模板方法这个设计模式是利用
protected
修饰符的一种思路和设计。父类定义了实现的模板,而具体实现则有子类提供 - 即:子类对象调用父类的模板方法,模板方法内再调用具体的子类的方法实现
10. final
关键字修饰类和方法的含义是
- 一个 Java 类,默认情况下都是可以被继承的,但加了
final
关键字之后就不能被继承了 - 一个非
final
的类,其中的public/protected
实例方法默认情况下都是可以被重写的,但加了final
关键字后就不能被重写了