黑马程序员技术交流社区

标题: 为什么这段程序编译失败? [打印本页]

作者: 何招俊    时间: 2012-2-14 13:31
标题: 为什么这段程序编译失败?
class Super{
        int i = 0;
        public Super(String s){
                i = 1;
        }
}
class Demo extends Super{
        public Demo (String s){
                i = 2;
        }
        public static void main(String args[]){
                Demo d = new Demo("yse");
                System.out.println(d.i);
        }
}
作者: 陈丹阳    时间: 2012-2-14 13:37
D:\code>javac Demo.java
Demo.java:8: 错误: 无法将类 Super中的构造器 Super应用到给定类型;
        public Demo (String s){
                              ^
  需要: String
  找到: 没有参数
  原因: 实际参数列表和形式参数列表长度不同
1 个错误
------------------------------------------------------------------------
调用子类构造函数时 或者显式 或者隐式地调用父类构造函数
若是不加 则默认加上super();
而父类没有空参数构造函数,因此报错。
可在子类构造函数前显式地加上super(String s);
作者: 彭坤    时间: 2012-2-14 14:07

  1. class Demo extends Super {
  2.         public Demo(String s) {
  3.              //super();
  4.                 i = 2;
  5.         }
  6.         public static void main(String args[]) {
  7.                 Demo d = new Demo("yes");
  8.                 System.out.println(d.i);
  9.         }
  10. }

  11. class Super {
  12.         public Super(){}
  13.         int i = 0;
  14.         public Super(String s) {
  15.                 i = 1;
  16.         }
  17. }
复制代码
不知道这段代码想表达什么,很费解
之所以报错是因为在父类的构造方法中没有显式的的默认无参的构造方法
加上去即可
作者: 侯丽星    时间: 2012-2-14 14:29
本帖最后由 侯丽星 于 2012-2-14 14:30 编辑

java编译器自动为一个类创建无参构造函数的前提是类中没有构造函数。
而你的Super类中定义了一个带参数的构造函数,那么java编译器就不会自动为其创建无参构造函数了。

子类Demo 继承了Super,那么如果在Demo的构造函数中没有用super来显示调用父类的构造函数,那么java编译器会自动为其调用父类Super的无参构造函数,而你的Super中没有无参构造函数,因此编译报错。
另外注意:super语句一定定义在子类构造函数的第一行。
作者: 蒙武辉    时间: 2012-2-14 14:35
个人认为是构造函数出问题,
class Super{
        int i = 0;
        public Super(String s){
                i = 1;
        }
String s在类中没有找到想对应的属性,应该知道,构造函数是给成员变量初始化用的。

作者: 毛溯澜    时间: 2012-2-14 14:41
调用子类构造函数时 或者显式 或者隐式地调用父类构造函数
若是不加 则默认加上super();
而父类没有空参数构造函数,因此报错。
父类加个super(){};或子类加个super(s);
作者: 刘丁    时间: 2012-2-14 14:42
在子类的构造方法中 第一行加上super() 就可以了 , 显示调用父类中的构造方法,

作者: 钟保罗    时间: 2012-2-14 22:55
Demo类中的构造函数中在i=2前面加上super(s);就可以了
  1. public class Demo extends Super{
  2.     public Demo(String s){
  3.         super(s);
  4.         i = 2;
  5.         
  6.     }
  7.     public static void main(String[] args){
  8.         Demo d = new Demo("yse");
  9.         System.out.println(d.i);
  10.     }
  11. }
复制代码
因为当你执行到子类的构造函数时,就会执行父类的构造函数,你那代码没有给父类的构造函数传递参数,所以出错了。。。
作者: 李杨    时间: 2012-2-14 23:31
呵呵。鸡下蛋,蛋生鸡。求解继承关系?

哈哈,玩笑啊。情人节快乐!

这段代码表示了类继承类的关系。即子类继承父类。

如果子类在创建对象的时候,即new对象的时候就会调用子类的构造方法,但是在调用子类构造方法的时候会先调用父类的,也就是多态,猫,狗都会先被定义成为动物,然后在具体的定义成是猫还是狗.

这位同学,你可以想象着把你子类中的构造方法的参数想成一句话,默认情况下,你会想着回家吃饭,爸爸也会想着你回家吃饭.所以呢你不用每次都告诉爸爸说我要回家吃饭.这样爸爸就会一直放心,即便你不告诉爸爸,爸爸也会知道你会回家吃饭的.
但是有一次,你没有回家吃饭,只是大脑里想着我今天要去女朋友家吃饭,你并没有打电话告诉爸爸,爸爸不知道你会在女朋友家里吃饭,爸爸还是一直以为你会回家吃饭呢,如果你要去女朋友家吃饭的话你要提前告诉爸爸,否则的话爸爸会不放心的.要做个好孩子.

呵呵..好像有点八卦了!!!
作者: 李杨    时间: 2012-2-14 23:36
补充说明:  八卦下!!!

凡是在情人节做继承出错的同学你们都在想你的女朋友呢吧?根本就没好好学习...哈哈!!!
作者: 石德志    时间: 2012-2-15 00:09
Demo d = new Demo("yse");引发问题,调用构造函数
public Demo (String s){
                i = 2;
        }
完成类的初始化动作,在执行i=2;这块代码之前隐式调用super()即父类默认的无参数的构造函数
public Super(){};因为父类中定义构造函数,系统就不再为起默认增加上无参的构造函数,所以就造成找不到父类的构造函数,从而使初始化动作失败。可以在i=2,之前显式的调用super("yes");后者在父类中显式的增加public Super(){};




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2