这是非常简单的java代码,但可以';我无法识别错误。我发现了一个语法错误
这是我的简单java代码。编译/运行程序时,EclipseIDE显示语法错误。语法错误对我来说毫无意义这是非常简单的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
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;实际原因见下面的答案。