这是非常简单的java代码,但无法识别错误。我得到语法错误

时间:2012-09-22 06:11:40

标签: java eclipse

这是我简单的java代码。编译/运行程序时,Eclipse IDE显示语法错误。语法错误对我没有任何意义

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();
    }
}

8 个答案:

答案 0 :(得分:3)

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

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

  • 为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中的InheritanceCreating Objects

答案 1 :(得分:1)

这里有一些事情需要考虑: -

  • 当你声明一个没有任何构造函数的类时,编译器会通过插入一个默认的构造函数来为你做这个,这是一个空的零参数构造函数。
  • 如果您已显式声明了one-arg构造函数(或任何其他构造函数),则编译器不会添加任何默认构造函数。
  • 每次创建类的实例时,都会在继承层次结构中从上到下调用​​构造函数。因此,如果您不使用继承,那么首先实例化一个类会调用Object类的构造函数(它是任何继承或非继承层次结构的顶级类)。
  • 我们使用super()调用超类构造函数,但是如果我们没有显式地执行它,编译器会为我们添加它..如果你自己添加它,请确保它应该是第一个语句构造函数..你可以将参数传递给super,调用超类的非零arg构造函数,但编译器只添加零参数super()。

现在,说了这么多,让我们转到你的代码.. 在你的类A中,你已经声明了一个三参数构造函数,因此编译器不会添加任何..所以,恰恰你没有任何零参数构造函数。 现在,您的 B类扩展了A ,因此实例化该类将调用超类构造函数,这是A。 现在,由于您没有在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()。

我希望这些信息至少可以解决你当前的问题。

答案 2 :(得分:0)

班级在哪里定义“A班”?数据字段定义在哪里(类别B的x,z,s和类A的x,z)?请编辑你的帖子

在编辑帖子之后,我尝试编译它,错误应该如下:

Simple.java:17:找不到符号 符号:构造函数A() 位置:A级     B(int a,int b,int c){                           ^ 1错误

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

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

B(int a, int b, int c){
    super(a,b);
    s=c;
}
祝你好运!

答案 3 :(得分:0)

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

看起来你没有在B组中定义int字段。应该是:

 class B extends A
 {
     int s;

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

答案 4 :(得分:0)

你已经明确地声明了A类的构造函数,所以B类应该显示出它的父类 - 类A - 构造函数。

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

super(a, b);

然后你的B类构造函数看起来像:

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

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

答案 5 :(得分:0)

你的超类有一个两个args构造函数,当你在类B的构造函数中扩展类A时,你已经调用了你的超类的两个args构造函数。 将您的子类构造函数代码更改为此。

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

this link explains it

答案 6 :(得分:0)

如果要将值设置为超类中定义的属性,请在子类构造函数中调用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;
}

答案 7 :(得分:-1)

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

但无论如何,您的语法错误源于您没有定义变量的数据类型,例如x,z,s等。

例如,

int x = a;
int z = b;