Java 实际参数和形式参数的长度不同-构造函数中存在错误

Java 实际参数和形式参数的长度不同-构造函数中存在错误,java,Java,我有两门以下的课 abstract class Shape { protected DrawAPI drawAPI; protected Shape(DrawAPI drawAPI){ this.drawAPI = drawAPI; } public abstract void draw(); } class Circle extends Shape { private int x, y, radius; public Circle

我有两门以下的课

    abstract class Shape {
   protected DrawAPI drawAPI;

   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   public abstract void draw(); 
}

class Circle extends Shape {
   private int x, y, radius;

   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      //super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }

   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}
如果不添加注释行(//super(drawAPI)),则Circle类的构造函数中会出现错误。错误是类形状中的构造函数形状无法应用于给定类型。实际参数和形式参数的长度不同


我想知道为什么添加注释行可以解决问题,以及它的作用是什么?

Shape类有一个唯一的构造函数,它不接受任何参数。因此,调用应该是
super()

这个
形状
类有一个唯一的构造函数,它不接受任何参数。因此,调用应该是
super()

检查此项,Java使用链接进行构造函数调用,默认情况下它将隐式调用无参数构造函数,但如果父类没有无参数构造函数(并且它有其他构造函数),则需要显式调用其他构造函数之一。

检查此项,Java使用链式调用构造函数,默认情况下它会隐式调用无参数构造函数,但是如果父类没有无参数构造函数(并且有其他构造函数),则需要显式调用其他构造函数之一。

Shape已经有了构造函数方法,因此不存在默认构造函数方法。

Shape已经有一个构造函数方法,因此不存在默认构造函数方法。

我认为您应该访问文档以更好地理解它

如果构造函数没有显式调用超类构造函数, Java编译器会自动插入对no参数的调用 超类的构造函数。如果超级类没有 没有参数构造函数,您将得到编译时错误。对象 确实有这样的构造函数,所以如果Object是唯一的超类, 没问题

在您的例子中,Shape没有默认构造函数,您需要使用参数显式地提到超类


我认为您应该访问文档以更好地理解它

如果构造函数没有显式调用超类构造函数, Java编译器会自动插入对no参数的调用 超类的构造函数。如果超级类没有 没有参数构造函数,您将得到编译时错误。对象 确实有这样的构造函数,所以如果Object是唯一的超类, 没问题

在您的例子中,Shape没有默认构造函数,您需要使用参数显式地提到超类

我想知道为什么添加注释行可以解决这个问题,以及它的作用是什么 是吗

如果构造函数有父类(适用于所有类,但不适用于
Object
),则构造函数的第一条语句必须调用其父类的构造函数。
Shape
Circle
的父对象。因此,必须首先在
Circle
构造函数中调用
Shape
构造函数。
问题是
Shape
构造函数没有您用参数定义的无参数构造函数。
因此,您必须显式调用此构造函数

请注意,如果未显式调用父构造函数,编译器会将
super()
调用添加为构造函数体的第一条语句。
因此,由于父构造函数没有参数,因此不需要在类源代码中调用
super()
。编译器将在已编译类中为您执行此操作。
但在实际情况中,编译器无法添加
super()
,因为父类没有无参数构造函数。
它将生成无效的构造函数调用:

public Circle(int x, int y, int radius, DrawAPI drawAPI) {
  super(); // Shape with no arg constructor doesn't exist
  this.x = x;  
  this.y = y;  
  this.radius = radius;
}
因此编译器希望您指定实际定义的父类构造函数的调用:

public Circle(int x, int y, int radius, DrawAPI drawAPI) {
  super(drawAPI); 
  this.x = x;  
  this.y = y;  
  this.radius = radius;
}
我想知道为什么添加注释行可以解决这个问题,以及它的作用是什么 是吗

如果构造函数有父类(适用于所有类,但不适用于
Object
),则构造函数的第一条语句必须调用其父类的构造函数。
Shape
Circle
的父对象。因此,必须首先在
Circle
构造函数中调用
Shape
构造函数。
问题是
Shape
构造函数没有您用参数定义的无参数构造函数。
因此,您必须显式调用此构造函数

请注意,如果未显式调用父构造函数,编译器会将
super()
调用添加为构造函数体的第一条语句。
因此,由于父构造函数没有参数,因此不需要在类源代码中调用
super()
。编译器将在已编译类中为您执行此操作。
但在实际情况中,编译器无法添加
super()
,因为父类没有无参数构造函数。
它将生成无效的构造函数调用:

public Circle(int x, int y, int radius, DrawAPI drawAPI) {
  super(); // Shape with no arg constructor doesn't exist
  this.x = x;  
  this.y = y;  
  this.radius = radius;
}
因此编译器希望您指定实际定义的父类构造函数的调用:

public Circle(int x, int y, int radius, DrawAPI drawAPI) {
  super(drawAPI); 
  this.x = x;  
  this.y = y;  
  this.radius = radius;
}

那么什么是
protectedshape(DrawAPI-DrawAPI){this.DrawAPI=DrawAPI;}
?在Android开发站点中没有看到这个其他构造函数问题不是Android标记的。我认为它是一个自定义的可绘制类,否则OP在编译时就不会有这种行为。那么
protectedshape是什么呢(DrawAPI DrawAPI){this.DrawAPI=DrawAPI;}
?在Android开发网站上看不到其他构造函数问题不是Android标记的。我认为这是一个自定义的可绘制类,否则OP在编译时不会有这种行为。只是为了补充这个答案,如果父抽象类没有构造函数,那么Java将假定默认的无参数构造函数。但是因为有一个构造函数,我