关于继承的构造方法的参数问题
这是一道题目的代码,问得是输出是否报错?错误是什么?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的继承。 你这个编译都过不了啊
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);
}
}
运行有错吗{:10_256:}{:10_256:} 本帖最后由 零度非安全 于 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 类没有无参构造器,那么就
会报错,错误是什么呢?我们来看下:
Implicit super constructor A() is undefined. Must explicitly invoke another constructor
这个意义是说构造器 A() 没有被定义,那么我就把光标处注释去掉,则如下没有报错
这是一种解决方案,还有一种解决方案就是在子类 B 中构造器中加上 super(m); 这句也能解决,如下:
也就是调用了父类带参的构造器,而没有调用无参的构造器。
想一想:
其实在第三点中说系统会隐式调用父类无参数的构造器,那就说明在 B 带参数的构造器中省略了 super(); 这句
总结:
super(); 没有参数,则会调用 A 类无参构造器,而 A 类没有,所以会报错,你在 super(); 给一个参数 m,则不
报错,至于结果为 2,我想你知道,这我就不用多说,这么多字,纯手打,希望楼主能明白!加油 ^_^!!!
zlj19931010 发表于 2017-4-18 09:27
你这个编译都过不了啊
1、要么super(m);
2、要么A提供一个无参的构造
不错!!! 还有一个没说到,就是执行父类构造器时,系统会再次上溯执行其父类构造器 · · · 依此类推
创建任何 Java 对象,最先执行的总是 java.lang.Object 类的构造器,因为它们都是 Object
类的子类。 零度非安全 发表于 2017-4-18 12:36
你要记住这一点,不管怎样,子类构造器总会调用父类构造器一次,还有一个就是它们都是 Object 的子类。
...
谢谢你们,解释得很清楚,也让我明白了许多,再次谢谢你们!
页:
[1]