面向对象集|每日一题:请问哪一行会产生错误?

321 阅读1分钟

以下代码是文件 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 行代码中,却在使用它的带参构造,很显然,在编译时它就会报错了。