A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Zhang_qian 中级黑马   /  2012-5-10 21:19  /  2163 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面的程序谁帮忙给改一下为什么编译不能通过
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("yes");
                 System.out.println(d.i);
         }
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

6 个回复

正序浏览
class Demo extends Super
{
         public Demo(String s)
         {
                        
                 i=2;    //这里应该写成:super.i=2;                    
        }
         public static void main(String[] args)
         {
                 Demo d=new Demo("yes");
                 System.out.println(d.i);
         }
}

你按照我说的方法试试看吧。
回复 使用道具 举报
class Demo extends Super
{
         public Demo(String s)
         {
                        
                 i=2;    //这里应该写成:super.i=2;                    
        }
         public static void main(String[] args)
         {
                 Demo d=new Demo("yes");
                 System.out.println(d.i);
         }
}

你按照我说的方法试试看吧。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
一、构造函数的问题,在定义一个类的时候,如果没有写出构造函数,系统会默认提供无参的构造方法,一旦定义了有参的构造方法,系统就不会提供无参的构造方法。
二、子类继承父类,在子类的构造方法中如果不指定需要调用的父类的构造方法,系统会默认调用父类无参的构造方法,也即是在子类构造方法中第一条语句默认是super()。就像楼主提供的代码中Demo类中的构造方法没有指定需要调用的其父类Super的构造方法,此时系统会在Demo的构造方法中默认调用Super类中的无参构造方法,而父类Super()已经给出有参的构造函数,系统就不会提供无参的构造,就找不到父类Super的无参构造,所以会报错。只需要在父类Super中添加无参构造方法即可解决问题。

一般在定义类的时候如果定义了有参的构造方法,也会把无参的构造方法也给定义了,这样方便子类创建对象时使用。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
改进方法:
1、在子类构造器中第一行加一句  super(s);
2、为父类定义无参构造器。
知识点解答:
当通过new 关键字创建子类对象时,虚拟机会先调用父类构造器。当子类没有显示调用父类构造器时,子类默认调用父类的默认构造器(即无参构造器)。然而,当父类定义了自己的构造器时,系统不会为类创建默认构造器,此时,子类没有显示调用父类构造器时,就会出错。因此,定义父类时,最好要定义无参构造器。
问题程序改进方案:
回复 使用道具 举报
本帖最后由 杨威 于 2012-5-10 21:48 编辑

构造函数问题
子类构造函数第一行隐含语句super(),而你的父类中没有空参数的构造函数,故编译不通过
原因是子类在初始化时先到父类初始化,然后在自己的构造函数中初始化,也可以在子类构造函数第一行手动显示语句父类带参数的构造语句。
在父类中加上空参数的改正方法,代码如下:
  1. class Super
  2. {
  3.          int i=0;  
  4.                  Super(){}//加入空构造函数

  5.         public Super(String s)
  6.          {
  7.                  i=1;        
  8.         }
  9. }
  10. class Demo extends Super
  11. {
  12.          public Demo(String s)
  13.          {
  14.                         
  15.                  i=2;                        
  16.         }
  17.          public static void main(String[] args)
  18.          {
  19.                  Demo d=new Demo("yes");
  20.                  System.out.println(d.i);
  21.          }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1

查看全部评分

回复 使用道具 举报
改进方法:
1、在子类构造器中第一行加一句  super(s);
2、为父类定义无参构造器。
知识点解答:
当通过new 关键字创建子类对象时,虚拟机会先调用父类构造器。当子类没有显示调用父类构造器时,子类默认调用父类的默认构造器(即无参构造器)。然而,当父类定义了自己的构造器时,系统不会为类创建默认构造器,此时,子类没有显示调用父类构造器时,就会出错。因此,定义父类时,最好要定义无参构造器。
问题程序改进方案:

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马