A类中的构造函数A不能应用于给定类型;

时间:2015-02-22 01:11:54

标签: java oop

class A{
    A(String s){
        System.out.println("New A" + s);
    }
    public static void main(String[] args){

    }
} 
class B{
    B(String s){
        System.out.println("New B" + s);
    }
    public static void main(String[] args){

    }
}
class C extends A{
    C(String s){
        System.out.println("New C" + s);
    }
    public static void main(String[] args){
    }
}
第28行

错误," C(字符串s){"

我正在按照一步一步的方式练习课程。非常困惑。非常感谢您帮助解决这个愚蠢的问题。

2 个答案:

答案 0 :(得分:3)

这是因为C扩展A.为了正确扩展,您还需要为A调用构造函数.A的唯一构造函数是A(String s)。以下应该有效:

C(String s){
    super(s); // calls new A(s)
    System.out.println("New B" + s);
}

基本上,当你在子类中创建一个构造函数(在本例中是C)时,它需要调用一个超类构造函数来设置对象的一部分"这对应于A(缺乏更好的术语)。如果不对超类构造函数进行显式调用,它将自动调用super()而不使用任何参数 - 仅当存在构造函数A() 时,它才会工作 1

1 这很复杂,因为如果你不在超类中构建一个构造函数,它实际上会有一个隐式构造函数,其内容如下: public A() {},意思是它不需要任何参数,也没有特别的作用。

答案 1 :(得分:0)

您可以在A和A类中添加默认构造函数。 C喜欢

public class A{
    public A(){}
    public A(String s){
        System.out.println("New A" + s);
    }
    public static void main(String[] args){

   }
} 
class C extends A{
    public C(){}
    public C(String s){
        System.out.println("New C" + s);
   }
   public static void main(String[] args){
   }
}