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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付左军 中级黑马   /  2012-5-3 18:31  /  1709 人查看  /  8 人回复  /   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);
        }
}
此程序哪错了?

8 个回复

正序浏览
class Super
{
        int i=0;
        Super(){}                //在父类中加个无参构造函数
        public Super(String s)
        {
                i=1;        
        }
}
class Demo extends Super
{
        public Demo(String s)
        {
                Super(s);   //或者在这里加个父类中自定义的有参构造函数  
                i=2;                        
        }
        public static void main(String[] args)
        {
                Demo d=new Demo("yes");
                System.out.println(d.i);
        }
}
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。

当子类继承父类的时候,子类中定义了构造函数,运行的时候必然先调用父类的构造方法,再调用自己的。如果父类中美定义构造函数,那么子类就不需要手动添加;如果父类定义了构造函数,那么子类要手动添加父类中指定的构造函数。子类中必须至少有一个构造函数添加了父类的构造函数。
回复 使用道具 举报
子类在实例化的时候会去调用父类的构造方法。
当然,在没有去父类在没有去指定任何的构造器的时候,
子类就会去调用父类的默认构造器。
但是你里的:
  1. public Super(String s){
  2.                 i=1;        
  3. }
复制代码
就是实现了对父类的默认构造器实现了重载,那么所谓的默认构造器
就不存在了。而你子类中的构造器:
  1. public Demo(String s)
  2. {
  3.                 i=2;                        
  4. }
复制代码
没有去调用父类中的构造器,那就是相当于是要去调用父类中的默认构造器。
而这时的默认构造器因为被重载也就不存在了。所以才会报错。
那么要解决这个问题。要么要父类中将默认构造器写出来。
或者在子类的构造器中加上:
  1. super(s);
复制代码
这样就不会有错了!
回复 使用道具 举报
当你在类中没有构造函数时。系统会默认的给你加上无参构造,一旦你在类中定义了有参构造,系统就不会默认给出了,所以当你在创建对象的时候如果是无参的对象你必须手动加上无参构造,如果你创建的是有参对象则必须引用父类的有参构造,并且放在你子类构造的第一行。
回复 使用道具 举报
当你在类中没有构造函数时。系统会默认的给你加上无参构造,一旦你在类中定义了有参构造,系统就不会默认给出了,所以当你在创建对象的时候如果是无参的对象你必须手动加上无参构造,如果你创建的是有参对象则必须引用父类的有参构造,并且放在你子类构造的第一行。
回复 使用道具 举报
楼上说的都正确
回复 使用道具 举报
当你在父类中定义了带参构造后,系统不会再自动提供无参构造。你子类中的构造方法第一行代码没有显示调用父类构造方法, 默认是调用的Super()这个无参构造,但父类中不存在该无参构造,故错误。修改的话,在子类中显示调用父类带参构造就可以了。
回复 使用道具 举报
父类当中没无参构造,在Super类中加入一句public Super(){}就可以了
构造子类之前是必须要先构造父类的,
如果不保留父类默认的构造器,子类中会调用缺省的super()
或者手动指定调用父类的 super(s)
回复 使用道具 举报
public Demo(String s)
        {
                super(s);//少了这句
                i=2;                       
        }

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