2

我已经遇到这个问题,我想知道是什么在这里的区别是:为什么我需要扩展抽象类中的另一个构造函数?

abstract class Abstract { 
    Abstract() { 
     System.out.println("Abstract.Abstract()"); 
    } 

    Abstract(String s) { 
     System.out.println("Abstract.Abstract(String)"); 
    } 

    void test() { 
     System.out.println("Abstract.test()"); 
    } 

    void test(String s) { 
     System.out.println("Abstract.test(s)"); 
    } 
} 

abstract class Base extends Abstract { 
} 

class Sub extends Base { 
    Sub(String s) { 
     super(s); // undefined constructor 
    } 

    void subTest(String s) { 
     super.test(s); // why is this all right then? 
    } 
} 

为什么我必须定义Base(String s)构造,使其编译但super.test(s)呼叫罚款没有定义什么?

回答

1

的Java提供了默认的构造函数中任何类(即使你不自己定义一个),这意味着你必须在BaseBase()默认的构造函数,但没有任何其他的构造函数(即接受参数,如Base(String s)because constructors are not inherited

此外,扩展一个类通过继承给你的方法,因此调用super.test(s)是合法的,因为这里有BaseAbstract继承的方法test(String s)

0

因为Base只定义了一个构造函数,所以no-args默认调用超类no-args构造函数。

现在,哪些超类cunstructors可用于Sub?只有一个。

相关问题