黑马程序员技术交流社区

标题: 求解答 [打印本页]

作者: Zhang_qian    时间: 2012-5-10 21:19
标题: 求解答
下面的程序谁帮忙给改一下为什么编译不能通过
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);
         }
}

作者: 刘旭    时间: 2012-5-10 21:41
改进方法:
1、在子类构造器中第一行加一句  super(s);
2、为父类定义无参构造器。
知识点解答:
当通过new 关键字创建子类对象时,虚拟机会先调用父类构造器。当子类没有显示调用父类构造器时,子类默认调用父类的默认构造器(即无参构造器)。然而,当父类定义了自己的构造器时,系统不会为类创建默认构造器,此时,子类没有显示调用父类构造器时,就会出错。因此,定义父类时,最好要定义无参构造器。
问题程序改进方案:
作者: 杨威    时间: 2012-5-10 21:42
本帖最后由 杨威 于 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. }
复制代码

作者: 刘旭    时间: 2012-5-10 21:42
改进方法:
1、在子类构造器中第一行加一句  super(s);
2、为父类定义无参构造器。
知识点解答:
当通过new 关键字创建子类对象时,虚拟机会先调用父类构造器。当子类没有显示调用父类构造器时,子类默认调用父类的默认构造器(即无参构造器)。然而,当父类定义了自己的构造器时,系统不会为类创建默认构造器,此时,子类没有显示调用父类构造器时,就会出错。因此,定义父类时,最好要定义无参构造器。
问题程序改进方案:
作者: 杨鹏    时间: 2012-5-10 21:45
一、构造函数的问题,在定义一个类的时候,如果没有写出构造函数,系统会默认提供无参的构造方法,一旦定义了有参的构造方法,系统就不会提供无参的构造方法。
二、子类继承父类,在子类的构造方法中如果不指定需要调用的父类的构造方法,系统会默认调用父类无参的构造方法,也即是在子类构造方法中第一条语句默认是super()。就像楼主提供的代码中Demo类中的构造方法没有指定需要调用的其父类Super的构造方法,此时系统会在Demo的构造方法中默认调用Super类中的无参构造方法,而父类Super()已经给出有参的构造函数,系统就不会提供无参的构造,就找不到父类Super的无参构造,所以会报错。只需要在父类Super中添加无参构造方法即可解决问题。

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

作者: 黄坚声    时间: 2012-5-10 22:07
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);
         }
}

你按照我说的方法试试看吧。
作者: 黄坚声    时间: 2012-5-10 22:07
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);
         }
}

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




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