黑马程序员技术交流社区

标题: 关于继承关系中构造方法的问题 [打印本页]

作者: 张凯    时间: 2012-7-13 17:57
标题: 关于继承关系中构造方法的问题
本帖最后由 张凯 于 2012-7-19 20:03 编辑

父类Person,有无参构造方法Person(),和公用方法func().

子类Teacher,有无参构造方法Teacher(),有参构造方法Teacher(int a)和公用方法func().



代码如下:





Java代码  
1.class Teacher extends Person {  
2.    public Teacher() {  
3.        super();  
4.    }  
5.    public Teacher(int a) {   
6.        System.out.print(a);  
7.    }  
8.    public void func() {  
9.        System.out.print("2,");  
10.    }  
11.    public static void main(String[] args) {  
12.        Teacher t1 = new Teacher();  
13.        Teacher t2 = new Teacher(3);  
14.    }  
15.  
16.}  
17.  
18.class Person {  
19.    public Person() {  
20.        func();  
21.    }  
22.    public void func() {  
23.        System.out.print("1,");  
24.    }  
25.}  

题目是問运行结果是什么?



我的理解如下:

        从主方法入手,声明Teacher类的实例t1和t2,其中t1使用无参构造方法Teacher()进行初始化,而Teacher()中使用super(),即使用父类Person中无参构造方法Person(),在这个父类的构造方法中调用了func().所以,实例t1输出是:1, .

        在实例t2中,使用有参构造方法Teacher(int a)进行初始化.所以,实例t2输出是:3

        所以猜测的运行结果应该为1,3



实际运行结果为:2,2,3



我的疑问是:为什么会在使用了super()的情况下,调用的func()却是子类中的func()?而且是调用了两次?望各位大神解答.

作者: 王冰    时间: 2012-7-13 18:34
public Teacher(int a) {  
        //super();//在子类中的所有构造函数的第一行均会有一句隐式的super()调用父类中空参数的构造函数
                      //故这个构造函数隐含有这句
       System.out.print(a);  
    }  

public static void main(String[] args) {  
      Teacher t1 = new Teacher();  //t1在初始化时会调用父类中空参数的构造函数,而空参数的构造函数会调用func()方法
                                                     //但是在子类中复写了父类的func()方法,由于函数的多态性,故会去调用子类中的func()方法
                                                     //所以这里会打印2
      
      Teacher t2 = new Teacher(3);  //t2在初始化时也是先调用父类空参数的构造方法,才会回来调用子类中特有的方法,
                                                      //所以这里先打印2,再打印3,因此最后的打印结果是2,2,3
  }  

作者: 全海波    时间: 2012-7-13 18:38
[img=13344,11111]桌面[/img]
作者: 全海波    时间: 2012-7-13 18:39
为什么不能上传图片呀
作者: 苑占丽    时间: 2012-7-13 18:49
1.class Teacher extends Person {  
2.    public Teacher() {  
3.        super(); 3.调用父类构造函数
2,第二部开始执行
4.    }  
5.    public Teacher(int a) {   
6.        System.out.print(a);  
7.    }  
8.    public void func() {  
9.        System.out.print("2,"); 6, 所以程序会调用这个子类方法第一次输出2,此时类已经进入到Teacher中,所以会从类开始的地方执行第二次输出2

10.    }  
11.    public static void main(String[] args) {  先从这开始读程序
12.        Teacher t1 = new Teacher();  //1.这个地方一new就开始加载类Teacher,然后进入其无参构造函数内
13.        Teacher t2 = new Teacher(3);  这个就没什么疑问了输出3
14.    }  
15.  
16.}  
17.  
18.class Person {  
19.    public Person() {  
20.        func();  5,开始此方法
4,第四部开始
21.    }  
22.    public void func() {  很明显这个方法被子类复写了,所以转到6
23.        System.out.print("1,");  
24.    }  
25.}  
不知我的分析你能接受吗,希望有帮助
作者: 王飞    时间: 2012-7-13 19:11
Java代码  
1.class Teacher extends Person {  
2.    public Teacher() {   
3.        super();  //此方法可以不用写,每个构造函数里面都会默认去调用父类的构造方法
4.    }  
5.    public Teacher(int a) {   
6.        System.out.print(a);  
7.    }  
8.    public void func() {  
9.        System.out.print("2,");  
10.    }  
11.    public static void main(String[] args) {  
12.        Teacher t1 = new Teacher();  
13.        Teacher t2 = new Teacher(3);  
14.    }  
15.  
16.}  
17.  
18.class Person {  
19.    public Person() {  
20.        func();  
21.    }  
22.    public void func() {  
23.        System.out.print("1,");  
24.    }  
25.}  

你t1一new对象就回去执行该类的无参构造函数,但是当看到这句话class Teacher extends Person时,程序:哦,原来我还继承了Person类,于是就去执行Person类的无参构造方法,父类无参构造函数有调用自己的func()方法,于是就去执行func()方法,但是但是但是。。。由于多态,编译时只要父类有func()方法就会编译通过,但是运行时就不会去运行父类的func()方法,而是运行自己特有的方法,所以先打印的是2;由于你第二个对象带参数,便会去运行带参数的构造方法,但是每个构造函数的第一行都默认的有super()这个方法,于是和前面一样,在打印一次2,最后打印的是3

故此结果打印的是2,2,3
作者: 张凯    时间: 2012-7-19 20:03
苑占丽 发表于 2012-7-13 18:49
1.class Teacher extends Person {  
2.    public Teacher() {  
3.        super(); 3.调用父类构造函 ...

恩 说的很详细,谢谢

作者: 王龙彪    时间: 2012-7-20 00:10
为什么会在使用了super()的情况下,调用的func()却是子类中的func()?而且是调用了两次?

这是因为多态啊.

打印2,2,3是因为子类在每次创建对象的时候,都会先调用父类的构造函数.
Teacher t1 = new Teacher();  
这句会先调用父类的的构造方法
然后父类的构造方法里面有个func(),这时候,父类会先去找子类中是否已经有这个方法,如果有,就会执行子类中的func()
如果没有,则会执行父类中的func().




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