以下代码是文件 Example.java 的全部内容,在编译时会产生一个错误,代码如下:
public class Example {
public void method() {
// 第1行代码
SubClass subClass = new SubClass("hello");
// 第2行代码
BaseClass baseClass = new BaseClass("world");
}
}
class SubClass extends BaseClass {
}
class BaseClass {
String str;
public BaseClass() {
System.out.println("ok");
}
public BaseClass(String s) {
str = s;
}
}
请问哪一行会产生这个错误?( )
A. 第 1 行
B. 第 2 行
C. 完全没有错误
D. 编译时没有错误,但运行时有异常
解析: 这道题主要考察的是子类会继承父类的哪些信息。
在 Java 中,子类可以继承父类所有的成员信息,但子类虽然继承了它们,却不一定是可以使用的,这是受到了访问权限修饰符的影响。
所以,像父类中被 private 修饰的,以及子类和父类不在同一个包(package)时,父类中被 默认 修饰的成员信息,子类是无法使用的。而父类中被 public、protected 修饰的成员信息,子类则可以直接使用。
另外,子类不可以继承父类的构造方法,因为构造方法名是和类名相同的,但是子类构造方法中会隐式调用父类的构造方法。
最后,我们来看这道题,这道题中子类 SubClass 没有定义任何带参构造方法,而第 1 行代码中,却在使用它的带参构造,很显然,在编译时它就会报错了。