这是我简单的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();
}
}
答案 0 :(得分:3)
在你的A类中,你提供了一个接受两个参数的构造函数,你没有为A定义一个无参数构造函数。因此,当你尝试实例化B时,扩展了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));
}
}
例如:
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中的Inheritance和Creating Objects
答案 1 :(得分:1)
这里有一些事情需要考虑: -
现在,说了这么多,让我们转到你的代码.. 在你的类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
}
答案 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;
等