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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(String s)
  5.         {
  6.                 i=1;
  7.         }
  8. }
  9. class Demo3 extends Super
  10. {
  11.         public Demo3(String s)
  12.         {
  13.                 i=2;
  14.         }
  15.         public static void main(String[] args) {
  16.                 Demo3 demo3=new Demo3("yes");
  17.                 System.out.println(demo3.i);
  18.         }
  19.        
  20. }
复制代码
如上例:必须有一个super()的方法才可以么

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
子类在实例化过程中:子类中所有的构造方法默认都会访问父类中的空参数的构造函数,因为子类继承了父类,获取了父类中的内容,所以在子类在使用父类内容之前需要了解父类内容是怎么初始化的,所以子类在创建对象时必须访问父类的构造函数,为了完成这个动作就在子类的构造函数中加入了super语句。
    但是如果父类中没有定义空参数构造函数,那么子类在访问父类时必须要明确访问那个父类构造函数。
    如果类中没有定义构造函数,会默认产生一个空参数构造函数,但是一旦定义的有了构造函数,就没有默认的空参数构造函数了。
    所以你这个要访问指定参数的构造函数,而不会访问空参数构造函数。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class Super
{
        int i=0;
        public Super(String s)
        {
                i=1;
        }
}
class Demo3 extends Super
{
        public Demo3(String s)
        {
           super(s)
               
            i=2;
        }
        public static void main(String[] args) {
                Demo3 demo3=new Demo3("yes");
                System.out.println(demo3.i);
        }
        
}
//可以没有,针对你这程序来说是必须有带参数的构造函数super(s):因为你的父类构造函数是带参数的,jvm运行子类时默认是在构造函数第一行加 super()调用父类的构造函数,但是你的父类构造函数无参构造被你显示的带参数构造函数覆盖了,所以就调用不到父类构造函数类初始化子类,不能完成子类正常的初始化

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
要么指定调用的父类的构造函数,要么给父类加上空参数的构造函数
回复 使用道具 举报
类似楼主这个程序 没有super(s)那么子类要拿到父类的 int i=0  就要在子类建立一个父类的对象,这就失去了继承的意义,也可以说super(s)省去了 在子类建立父类对象的过 程,更为方便实用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马