这是非常简单的java代码,但可以';我无法识别错误。我发现了一个语法错误

这是非常简单的java代码,但可以';我无法识别错误。我发现了一个语法错误,java,eclipse,Java,Eclipse,这是我的简单java代码。编译/运行程序时,EclipseIDE显示语法错误。语法错误对我来说毫无意义 class A { int x; int z; int s; A(int a,int b) { x=a; z=b; } void display() { System.out.println("x+y :"+(x+z)); } } class B extends A { B(i

这是我的简单java代码。编译/运行程序时,EclipseIDE显示语法错误。语法错误对我来说毫无意义

class A {
    int x;
    int z;
    int s;

    A(int a,int b) {
        x=a;
        z=b;
    }

    void display() {
        System.out.println("x+y :"+(x+z));
    }
}

class B extends A
{
    B(int a, int b, int c) {
        x=a;
        z=b;
        s=c;
    }

    void display() {
        System.out.print("In B class...");
        System.out.println("x+y+s :"+(x+z+s));
    }
}

public class Simple {
    public static void main(String[] args) {
        A ob=new A(10, 20);
        B ob2=new B(20, 30, 40);
        ob.display();
        ob2.display();
    }
}

“a类”的定义在哪里?数据字段的定义在哪里(x、z、s表示B类,x、z表示A类)?请编辑你的帖子

在文章编辑之后,我尝试编译它,错误如下:

Simple.java:17:找不到符号 符号:构造函数A() 地点:甲级 B(内部a、内部B、内部c){ ^ 1错误

这意味着您在创建类B时应该调用类A的某个构造函数,因为B扩展了A。您没有默认构造函数,因为您创建了自己的构造函数

像这样重写B的构造函数,你会没事的:

B(int a, int b, int c){
    super(a,b);
    s=c;
}

祝你好运!

首先,发布eclipse给出的错误会很有帮助

但在任何情况下,语法错误都是由于没有定义变量(如x、z、s等)的数据类型

比如说,

int x = a;
int z = b;
等等。

格式(缺少)使其难以阅读。类A定义的开始在代码块之外

看起来您没有在类B中定义int字段s。应该是:

 class B extends A
 {
     int s;

  ...
  }

编辑:看起来您在我发布答案时重新格式化并更改了它…

在您的类A中,您提供了一个接受两个参数的构造函数,并且没有为A定义无参数构造函数。因此,当您尝试实例化扩展A的B时,它失败了,因为它无法调用
A()

有两种方法可以解决此问题:

比如:

class A{
    int x;
    int z;
    int s;

    public A(){
    }

    public A(int a,int b){
        x=a;
        z=b;
    }

    void display(){
        System.out.println("x+y :"+(x+z));
    }
}
  • 调用super(a,b)作为b的构造函数中的第一个语句
例如:

class B extends A
{
    B(int a, int b, int c){
        super(a,b);
        x=a;
        z=b;
        s=c;
    }

    void display(){
        System.out.print("In B class...");
        System.out.println("x+y+s :"+(x+z+s));
    }
}

如果您是Java新手,您可能想了解Java,并且在Java中,您已经明确声明了类A的构造函数,因此类B应该明确地调用其父类的-Class A-constructor

将以下代码添加到B类的构造函数中:

super(a, b);
那么您的B类构造函数将如下所示:

B(int a, int b, int c) {
    super(a, b);
    x = a;
    z = b;
    s = c;
}

PS,请注意粘贴的代码的格式。这很难阅读。

您的超类有一个双参数构造函数,当您在类B的构造函数中扩展类A时,您必须调用您的超类的双参数构造函数。 将子类构造函数代码更改为此

B(int a, int b, intc) {
   super(a,b); //this has to be in the first line inside the constructor.
    //do your things
  }

如果要将值设置为在超类中定义的属性,请在子类构造函数中调用super()方法

因此,您的子类构造函数应该如下所示

public B(int a, int b, int c){
    // The following statement will automatically sets the values to the base class             properties (which are already derived into derived class).
    super(a, b);
    // No Need of setting the values to the super class properties... The above statement will automatically sets the values...
    s=c;
}

这里需要考虑以下几点:

  • 当您声明一个没有任何构造函数的类时,编译器会通过插入一个默认构造函数(即空的零参数构造函数)来为您执行此操作
  • 若您已显式声明了一个参数构造函数(或任何其他构造函数),则编译器不会添加任何默认构造函数
  • 每次创建一个类的实例时,都会在继承层次结构中自上而下调用构造函数。因此,如果不使用继承,则实例化一个类首先调用对象类的构造函数(这是任何继承或非继承层次结构的顶级类)
  • 我们使用super()调用超类构造函数,但如果我们没有显式地调用它,编译器将为我们添加它。如果您自己添加它,请确保它应该是构造函数的第一条语句。您可以将参数传递给super,以调用超类的非零参数构造函数,但编译器只添加零参数super()
现在,说了所有这些,让我们转到您的代码。。 在类A中,您已经声明了一个三参数构造函数,所以编译器不会添加任何..所以,确切地说,这里没有任何零参数构造函数。 现在,您的类B扩展了一个,因此实例化该类将调用超级类构造函数,它在这里是一个。 现在,由于您尚未在B类中添加任何super()调用,编译器将自动添加到该类中。 但是,编译器添加的是:super(),它将调用A的零参数构造函数,我们看到您没有

那么,你如何解决这个问题呢

向类a添加默认构造函数:

class A {
    public A() {
    }
}
或者在B的构造函数中添加一个显式super()调用作为第一个语句,以调用3-arg A的构造函数:-

class B extends A {
    public B(int a, int b) {
          super(a, b, 19);
          /* More Code */
    }
}
与super()类似,您也可以在构造函数中使用this()来调用同一类的构造函数。相同的规则适用于this()。它应该是构造函数中的第一条语句

所以,我们可以看到,在构造函数中可以有super()或this()


我希望这些信息至少能解决您当前的问题。

非常感谢。是的,我是java新手,对stackoverflow也很陌生。谢谢。我对stackoverflow很陌生,下次我会处理格式问题。您不应该为x、z、s提供类型,它们是从类A继承的。实际上代码如下:this.x=a;this.z=b;this.s=c;实际原因见下面的答案。