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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

代码如下,为什么通过super(name, age);方式为子类初始化之后,调用子类get方法name为null,age为0;不是已经初始化了吗?糊涂了!
  1. package com.heisejiuhuche.OOP;


  2. public class OOPTest {
  3.         public static void main(String[] args) {
  4.                 Father f = new Father("lisi", 12);
  5.                 System.out.println(f.getName());
  6.                 Sub s = new Sub("zhangsan", 19);
  7.                 System.out.println(s.getAge());
  8.         }
  9. }

  10. class Father {
  11.         private String name;
  12.         private int age;

  13.         Father(String name, int age) {
  14.                 this.name = name;
  15.                 this.age = age;
  16.         }

  17.         public String getName() {
  18.                 return name;
  19.         }

  20.         public void setName(String name) {
  21.                 this.name = name;
  22.         }

  23.         public int getAge() {
  24.                 return age;
  25.         }

  26.         public void setAge(int age) {
  27.                 this.age = age;
  28.         }

  29. }

  30. class Sub extends Father {
  31.         private String name;
  32.         private int age;

  33.         Sub(String name, int age) {
  34.                 super(name, age);
  35.         }

  36.         public String getName() {
  37.                 return name;
  38.         }

  39.         public void setName(String name) {
  40.                 this.name = name;
  41.         }

  42.         public int getAge() {
  43.                 return age;
  44.         }

  45.         public void setAge(int age) {
  46.                 this.age = age;
  47.         }

  48.         public String toString() {
  49.                 return this.name + ":" + this.age;
  50.         }
  51. }
复制代码



评分

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

查看全部评分

21 个回复

正序浏览
super(name, age)这一句等价于new Father(name,age).
而new Father(name,age)一句代码按顺序做下面四件事:
  • 找到Father.class文件并加载到内存中
  • 在堆内存中为Father对象分配内存地址,开辟内存空间
  • 在第2步开辟的空间内建立Father对象的属性,并进行默认初始化,String类型初始化为null,int类型初始化为0
  • 执行Father类的构造函数中的代码,此函数内的this指向Father对象
回复 使用道具 举报
谢谢啦,很有用!
回复 使用道具 举报
顶起来   赞
回复 使用道具 举报
ROFFY 中级黑马 2015-4-20 22:17:30
19#
class sub  里面不用定义name和age 了

一般写构造方法,应该直接加上无参构造
回复 使用道具 举报
来学习了
回复 使用道具 举报
在sub类的只写Sub(String name, int age) {             super(name, age);         }就ok了,子类中已经继承了father中的age和name就不用再写方法了,刚刚没注意看。
回复 使用道具 举报
多谢大家解答!统一感谢了~:handshake
回复 使用道具 举报
静心明德 发表于 2015-4-20 18:37
我感觉你的继承写的没有意义的,对于父类有的功能,子类就没有必要再去定义了,可以直接利用父类的。
下面 ...

多谢! 我再继续想想~
回复 使用道具 举报
静心明德 发表于 2015-4-20 18:37
我感觉你的继承写的没有意义的,对于父类有的功能,子类就没有必要再去定义了,可以直接利用父类的。
下面 ...

谢谢!还在摸索~ 东西太多脑子搅乱了~ 慢慢理一下! 再次感谢!
回复 使用道具 举报 1 0
学习了 楼主
回复 使用道具 举报
谢谢楼主~~
回复 使用道具 举报
不错的贴,太喜欢了,大家都顶啊
回复 使用道具 举报
你初始化只是初始化了父类,子类还是默认初始值,而子类覆盖了父类的方法,则子类对象肯定调用的是子类覆盖后的方法,也就只能打印出默认初始值。8楼正解!
回复 使用道具 举报
father类中private改为projected,超类中私有化了,不能被子类调用。
回复 使用道具 举报
我感觉你的继承写的没有意义的,对于父类有的功能,子类就没有必要再去定义了,可以直接利用父类的。
下面是我实现了你的要求的一种,附注释

  1. <p> </p>
复制代码
  1. package com.heisejiuhuche.OOP;
  2. class Father {
  3.         private String name;
  4.         private int age;

  5.         Father(String name, int age) {
  6.                 this.name = name;
  7.                 this.age = age;
  8.         }

  9.         public String getName() {
  10.                 return name;
  11.         }

  12.         public void setName(String name) {
  13.                 this.name = name;
  14.         }

  15.         public int getAge() {
  16.                 return age;
  17.         }

  18.         public void setAge(int age) {
  19.                 this.age = age;
  20.         }
  21. }

  22. class Sub extends Father {
  23.         private String name;
  24.         private int age;

  25.         Sub(String name, int age) {
  26.                 super(name,age);//调用父类的构造方法,因为这两个属性的权限是private,对name,age做的初始化对子类不管用
  27.                 //下面这样是对子类属性赋值
  28.                 this.name = name;
  29.                 this.age = age;
  30.         }

  31.         public String getName() {
  32.                 return name;
  33.         }

  34.         public void setName(String name) {
  35.                 this.name = name;
  36.         }

  37.         public int getAge() {
  38.                 return age;
  39.         }

  40.         public void setAge(int age) {
  41.                 this.age = age;
  42.         }

  43.         public String toString() {
  44.                 return this.name + ":" + this.age;
  45.         }
  46. }

  47. public class OOPTest {
  48.         public static void main(String[] args) {
  49.                 Father f = new Father("lisi", 12);
  50.                 System.out.println(f.getName());
  51.                 Sub s = new Sub("zhangsan", 19);
  52.                 System.out.println(s.getAge());//打印出19
  53.                 System.out.println(s.getName());//打印出张三
  54.         }
  55. }
复制代码



回复 使用道具 举报
子类的super(name,age) 相当于更改了父类对象里面的值,那子类的成员变量还是默认值
                Father f = new Father("lisi", 12);
                System.out.println(f.getName());
                Sub s = new Sub("zhangsan", 19);
                System.out.println(f.getName());//加上这就就看到了
                System.out.println(s.getAge());
回复 使用道具 举报
如果一定要父类SUPER 父类初始化 那就 子类别覆盖父类GET方法
回复 使用道具 举报
  1. public class OOPTest {
  2.         public static void main(String[] args) {
  3.                 Father f = new Father("lisi", 12);
  4.                 System.out.println(f.getName());
  5.                 Sub s = new Sub("zhangsan", 19);
  6.                 System.out.println(s.getAge());
  7.         }
  8. }

  9. class Father {
  10.         private String name;
  11.         private int age;
  12.         
  13.         Father(){}
  14.         Father(String name, int age) {
  15.                 this.name = name;
  16.                 this.age = age;
  17.         }

  18.         public String getName() {
  19.                 return name;
  20.         }

  21.         public void setName(String name) {
  22.                 this.name = name;
  23.         }

  24.         public int getAge() {
  25.                 return age;
  26.         }

  27.         public void setAge(int age) {
  28.                 this.age = age;
  29.         }

  30. }

  31. class Sub extends Father {
  32.         private String name;
  33.         private int age;

  34.         Sub(String name, int age) {
  35.                  this.name = name;
  36.              this.age = age;
  37.         }

  38.         public String getName() {
  39.                 return name;
  40.         }

  41.         public void setName(String name) {
  42.                 this.name = name;
  43.         }

  44.         public int getAge() {
  45.                 return age;
  46.         }

  47.         public void setAge(int age) {
  48.                 this.age = age;
  49.         }

  50.         public String toString() {
  51.                 return this.name + ":" + this.age;
  52.         }
  53. }
复制代码


回复 使用道具 举报
或者 你父类 写个空参构造函数 子类直接this赋值实参
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马