鱼C论坛

 找回密码
 立即注册
查看: 4482|回复: 6

[已解决]关于继承的构造方法的参数问题

[复制链接]
发表于 2017-4-17 21:59:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一道题目的代码,问得是输出是否报错?错误是什么?
class A{
        public int i = 0;
        A(int m){
                i = 1;
        }
}

class B extends A{
        B(int m){
                i = 2;
        }
}

public class Test{
        public static void main(String args[]){
                B b = new B(100);
                System.out.println(b.i);
        }
}


哪位大神解释一下原因?

PS:本人新手,刚学到java的继承。
最佳答案
2017-4-18 12:36:21
本帖最后由 零度非安全 于 2017-4-18 12:43 编辑

你要记住这一点,不管怎样,子类构造器总会调用父类构造器一次,还有一个就是它们都是 Object 的子类。

我跟你补充点东西,如下:

子类构造器 调用 父类构造器 分以下三种情况,希望楼主能记在心里 ^_^!

1. 子类构造器执行体第一行使用 super 显示调用父类构造器

2. 子类构造器执行体第一行使用 this 显示调用本类重载构造器

3. 子类构造器执行体既没有 super 调用,也没有 this调用,那么系统会隐式调用父类无参数的构造器

那好,我们来看下你发的这个问题,以下是我的分析:

你用 B 类去初始化一个实例对象 b,传入参数 100,则接下来会调用 B 类带参的构造器来初始化 b,B 类继承 A 类

B 是 A 的子类,B 类中的构造器既没有 super 调用,也没有 this 调用,那么就符合上面我说的第三种情况,系统会
隐式调用父类无参数的构造器,即 A 类无参数的构造器,但是,重点来了,你给出的 A 类没有无参构造器,那么就

会报错,错误是什么呢?我们来看下:
error.png


Implicit super constructor A() is undefined. Must explicitly invoke another constructor

这个意义是说构造器 A() 没有被定义,那么我就把光标处注释去掉,则如下没有报错
0.png


这是一种解决方案,还有一种解决方案就是在子类 B 中构造器中加上 super(m); 这句也能解决,如下:
1.png


也就是调用了父类带参的构造器,而没有调用无参的构造器。

想一想:

其实在第三点中说系统会隐式调用父类无参数的构造器,那就说明在 B 带参数的构造器中省略了 super(); 这句


总结:


super(); 没有参数,则会调用 A 类无参构造器,而 A 类没有,所以会报错,你在 super(); 给一个参数 m,则不


报错,至于结果为 2,我想你知道,这我就不用多说,这么多字,纯手打,希望楼主能明白!加油 ^_^!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-18 09:27:06 | 显示全部楼层
你这个编译都过不了啊
1、要么super(m);
2、要么A提供一个无参的构造

运行没错
package test;

class A {
        public int i = 0;

//        A(){}
        A(int m) {
                i = 1;
        }
}

class B extends A {
        B(int m) {
                super(m);
                i = 2;
        }
}

public class run {
        public static void main(String args[]) {
                B b = new B(100);
                System.out.println(b.i);
        }
}
84AO_KA([%Y61{$}[U1$9I6.png

评分

参与人数 2荣誉 +5 鱼币 +9 收起 理由
若余相思 + 5 + 5 谢谢
零度非安全 + 4 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-4-18 09:32:52 | 显示全部楼层
运行有错吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-18 12:36:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 零度非安全 于 2017-4-18 12:43 编辑

你要记住这一点,不管怎样,子类构造器总会调用父类构造器一次,还有一个就是它们都是 Object 的子类。

我跟你补充点东西,如下:

子类构造器 调用 父类构造器 分以下三种情况,希望楼主能记在心里 ^_^!

1. 子类构造器执行体第一行使用 super 显示调用父类构造器

2. 子类构造器执行体第一行使用 this 显示调用本类重载构造器

3. 子类构造器执行体既没有 super 调用,也没有 this调用,那么系统会隐式调用父类无参数的构造器

那好,我们来看下你发的这个问题,以下是我的分析:

你用 B 类去初始化一个实例对象 b,传入参数 100,则接下来会调用 B 类带参的构造器来初始化 b,B 类继承 A 类

B 是 A 的子类,B 类中的构造器既没有 super 调用,也没有 this 调用,那么就符合上面我说的第三种情况,系统会
隐式调用父类无参数的构造器,即 A 类无参数的构造器,但是,重点来了,你给出的 A 类没有无参构造器,那么就

会报错,错误是什么呢?我们来看下:
error.png


Implicit super constructor A() is undefined. Must explicitly invoke another constructor

这个意义是说构造器 A() 没有被定义,那么我就把光标处注释去掉,则如下没有报错
0.png


这是一种解决方案,还有一种解决方案就是在子类 B 中构造器中加上 super(m); 这句也能解决,如下:
1.png


也就是调用了父类带参的构造器,而没有调用无参的构造器。

想一想:

其实在第三点中说系统会隐式调用父类无参数的构造器,那就说明在 B 带参数的构造器中省略了 super(); 这句


总结:


super(); 没有参数,则会调用 A 类无参构造器,而 A 类没有,所以会报错,你在 super(); 给一个参数 m,则不


报错,至于结果为 2,我想你知道,这我就不用多说,这么多字,纯手打,希望楼主能明白!加油 ^_^!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-18 12:36:45 | 显示全部楼层
zlj19931010 发表于 2017-4-18 09:27
你这个编译都过不了啊
1、要么super(m);
2、要么A提供一个无参的构造

不错!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-18 12:41:40 | 显示全部楼层
还有一个没说到,就是执行父类构造器时,系统会再次上溯执行其父类构造器 · · · 依此类推

创建任何 Java 对象,最先执行的总是 java.lang.Object 类的构造器,因为它们都是 Object

类的子类。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-18 14:17:41 | 显示全部楼层
零度非安全 发表于 2017-4-18 12:36
你要记住这一点,不管怎样,子类构造器总会调用父类构造器一次,还有一个就是它们都是 Object 的子类。

...

谢谢你们,解释得很清楚,也让我明白了许多,再次谢谢你们!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 13:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表