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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘林虎 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

10 个回复

倒序浏览

回帖奖励 +2

这里不是调用的Person的构造方法。
而是super.show();时调用父类的show(),而此时GouZao类中没有定义name字段,所以引用的也为Person中的name字段
打印的结果就为:张三

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报

回帖奖励 +2

这里牵扯到子类实例化的过程了.
extends继承父类后就包含了父类所有的方法.
在new创建子类构造函数时会先对父类的空参构造函数进行创建,也就是将张三赋值给name,之后再调用show方法打印出张三.
建议楼主掌握下子类实例化过程就一目了然了.
1)如果有静态代码块,则先执行代码块,如果没有则执行静态
2)如果有构造代码块,则先执行构造代码块,如果没有再执行构造函数
3)new创建对象时会自动对空参的构造函数执行,上面张三的值就是在new子类构造函数时创建了父类的构造函数.
回复 使用道具 举报

回帖奖励 +2

在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();

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

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

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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报

回帖奖励 +2

第一"张三"是调用了父类中的show()方法而打印出来的.
第二"张三"是因为子类继承了父类,因此子类中也有一份父类初始化后的name值.所以第二"name"是继承过来的
回复 使用道具 举报

回帖奖励 +2

本帖最后由 张钶 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

回帖奖励 +2

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报

回帖奖励 +2

又巩固一下基础:)
回复 使用道具 举报

回帖奖励 +2

学习ING........
回复 使用道具 举报

回帖奖励 +2

学习了,楼主
回复 使用道具 举报

回帖奖励 +2

我来学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马