黑马程序员技术交流社区

标题: 创建g后,为什么调用的是构造方法Person()啊? [打印本页]

作者: 刘林虎    时间: 2013-4-4 17:38
标题: 创建g后,为什么调用的是构造方法Person()啊?
本帖最后由 刘林虎 于 2013-4-4 23:44 编辑

输出结果:李四
张三
张三
创建对象p后,p调用的是构造方法Person00(String na),创建g后,为什么调用的是构造方法Person()啊?求各位帮帮忙啊,我很想知道原因啊
  1. class Person{
  2. protected String name;
  3. public Person(String na){
  4. name=na;
  5. }
  6. public Person(){
  7. name="张三";
  8. }
  9. public void show(){
  10. System.out.println(name);
  11. }
  12. }
  13. public class GouZao extends Person{
  14. public void show(){
  15. super.show();
  16. System.out.println(name);
  17. }
  18. public static void main(String args[]){
  19. Person p=new Person("李四");
  20. p.show();
  21. GouZao g=new GouZao();
  22. g.show();
  23. }
  24. }
复制代码

作者: 潘佳强    时间: 2013-4-4 18:04
这里不是调用的Person的构造方法。
而是super.show();时调用父类的show(),而此时GouZao类中没有定义name字段,所以引用的也为Person中的name字段
打印的结果就为:张三
作者: luguoyuanf    时间: 2013-4-4 18:23
这里牵扯到子类实例化的过程了.
extends继承父类后就包含了父类所有的方法.
在new创建子类构造函数时会先对父类的空参构造函数进行创建,也就是将张三赋值给name,之后再调用show方法打印出张三.
建议楼主掌握下子类实例化过程就一目了然了.
1)如果有静态代码块,则先执行代码块,如果没有则执行静态
2)如果有构造代码块,则先执行构造代码块,如果没有再执行构造函数
3)new创建对象时会自动对空参的构造函数执行,上面张三的值就是在new子类构造函数时创建了父类的构造函数.

作者: 杨成    时间: 2013-4-4 18:25
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();

super():会访问父类中空参数的构造函数,并且子类中所有的构造函数默认第一行都是super();

为什么子类一定要访问父类中的构造函数?

因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。子类在对象初始化时,要先访问一下父类中的构造函数,如果要访问父类中的指定构造函数,可以通过手动定义super语句的方式来指定。

注意:super语句一定要定义在子类构造函数的第一行。

结论:子类的所有的构造函数默认都会访问父类中空参数的构造函数,因为子类每一个构造函数内的第一行都有一句隐式super();

当父类中没有空参数的构造函数时,子类必须通过手动super()语句的形式来指定要访问父类中的构造函数。当然子类的构造函数第一行也可以手动指定this语句类访问本类中的构造函数,子类中至少会有一个构造函数会访问父类中的构造函数。

作者: HM何伟    时间: 2013-4-4 19:28
第一"张三"是调用了父类中的show()方法而打印出来的.
第二"张三"是因为子类继承了父类,因此子类中也有一份父类初始化后的name值.所以第二"name"是继承过来的
作者: 张钶    时间: 2013-4-4 20:11
本帖最后由 张钶 于 2013-4-4 20:12 编辑
  1. class Person{
  2. protected String name;
  3. public Person(String na){
  4. name=na;
  5. }
  6. public Person(){
  7. name="张三";
  8. }
  9. public void show(){
  10. System.out.println(name);//           4.打印 张三
  11. }
  12. public class GouZao extends Person{
  13. public void show(){
  14. super.show();//                              3,去父类中找show方法
  15. System.out.println(name);//          5.将父类的字段name继承到子类,打印张三
  16. public static void main(String args[]){
  17. Person p=new Person("李四");
  18. p.show();//                                    1,打印李四
  19. GouZao g=new GouZao();
  20. g.show();//                                    2.到自己的类中找show方法
  21. }
复制代码

作者: 黄玉昆    时间: 2013-4-4 23:24
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: ⋛⋌⋚JEEP    时间: 2014-7-15 23:47
又巩固一下基础:)
作者: a191170796    时间: 2014-7-16 11:24
学习ING........
作者: nxp1986    时间: 2014-7-17 23:07
学习了,楼主
作者: 刘斌2014    时间: 2014-7-30 08:47
我来学习一下




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