黑马程序员技术交流社区

标题: 学糊涂了,大家帮忙看一下继承的问题 [打印本页]

作者: 黑色救护车    时间: 2015-4-20 11:07
标题: 学糊涂了,大家帮忙看一下继承的问题
代码如下,为什么通过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. }
复制代码




作者: 黑色救护车    时间: 2015-4-20 16:25
求大神回复。。。搞不懂。。。要崩溃了。。。
作者: sunyue    时间: 2015-4-20 16:34
你父类 成员变量 私有了啊 那你子类的 GET方法 也用SUPER调用父类GET
作者: sunyue    时间: 2015-4-20 16:38
或者 你父类 写个空参构造函数 子类直接this赋值实参
作者: sunyue    时间: 2015-4-20 16:41
  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. }
复制代码



作者: sunyue    时间: 2015-4-20 16:46
如果一定要父类SUPER 父类初始化 那就 子类别覆盖父类GET方法
作者: jiao142857    时间: 2015-4-20 18:27
子类的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());
作者: 静心明德    时间: 2015-4-20 18:37
我感觉你的继承写的没有意义的,对于父类有的功能,子类就没有必要再去定义了,可以直接利用父类的。
下面是我实现了你的要求的一种,附注释

  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. }
复制代码




作者: 追忆似水年华    时间: 2015-4-20 20:38
father类中private改为projected,超类中私有化了,不能被子类调用。
作者: redlake    时间: 2015-4-20 20:48
你初始化只是初始化了父类,子类还是默认初始值,而子类覆盖了父类的方法,则子类对象肯定调用的是子类覆盖后的方法,也就只能打印出默认初始值。8楼正解!
作者: itheima_llt    时间: 2015-4-20 20:51
不错的贴,太喜欢了,大家都顶啊
作者: itheima_llt    时间: 2015-4-20 21:16
谢谢楼主~~
作者: wj5877    时间: 2015-4-20 21:47
学习了 楼主

作者: 黑色救护车    时间: 2015-4-20 21:56
静心明德 发表于 2015-4-20 18:37
我感觉你的继承写的没有意义的,对于父类有的功能,子类就没有必要再去定义了,可以直接利用父类的。
下面 ...

谢谢!还在摸索~ 东西太多脑子搅乱了~ 慢慢理一下! 再次感谢!
作者: 黑色救护车    时间: 2015-4-20 21:57
静心明德 发表于 2015-4-20 18:37
我感觉你的继承写的没有意义的,对于父类有的功能,子类就没有必要再去定义了,可以直接利用父类的。
下面 ...

多谢! 我再继续想想~
作者: 黑色救护车    时间: 2015-4-20 21:59
多谢大家解答!统一感谢了~:handshake
作者: 追忆似水年华    时间: 2015-4-20 21:59
在sub类的只写Sub(String name, int age) {             super(name, age);         }就ok了,子类中已经继承了father中的age和name就不用再写方法了,刚刚没注意看。
作者: 晓月清晖明    时间: 2015-4-20 22:05
来学习了
作者: ROFFY    时间: 2015-4-20 22:17
class sub  里面不用定义name和age 了

一般写构造方法,应该直接加上无参构造
作者: 跳得更远    时间: 2015-4-20 22:19
顶起来   赞
作者: itheima_llt    时间: 2015-4-20 23:16
谢谢啦,很有用!
作者: waylent    时间: 2015-4-21 00:00
super(name, age)这一句等价于new Father(name,age).
而new Father(name,age)一句代码按顺序做下面四件事:





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