黑马程序员技术交流社区
标题:
学糊涂了,大家帮忙看一下继承的问题
[打印本页]
作者:
黑色救护车
时间:
2015-4-20 11:07
标题:
学糊涂了,大家帮忙看一下继承的问题
代码如下,为什么通过super(name, age);方式为子类初始化之后,调用子类get方法name为null,age为0;不是已经初始化了吗?糊涂了!
package com.heisejiuhuche.OOP;
public class OOPTest {
public static void main(String[] args) {
Father f = new Father("lisi", 12);
System.out.println(f.getName());
Sub s = new Sub("zhangsan", 19);
System.out.println(s.getAge());
}
}
class Father {
private String name;
private int age;
Father(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Sub extends Father {
private String name;
private int age;
Sub(String name, int age) {
super(name, age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return this.name + ":" + this.age;
}
}
复制代码
作者:
黑色救护车
时间:
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
public class OOPTest {
public static void main(String[] args) {
Father f = new Father("lisi", 12);
System.out.println(f.getName());
Sub s = new Sub("zhangsan", 19);
System.out.println(s.getAge());
}
}
class Father {
private String name;
private int age;
Father(){}
Father(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Sub extends Father {
private String name;
private int age;
Sub(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return this.name + ":" + this.age;
}
}
复制代码
作者:
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
我感觉你的继承写的没有意义的,对于父类有的功能,子类就没有必要再去定义了,可以直接利用父类的。
下面是我实现了你的要求的一种,附注释
<p> </p>
复制代码
package com.heisejiuhuche.OOP;
class Father {
private String name;
private int age;
Father(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Sub extends Father {
private String name;
private int age;
Sub(String name, int age) {
super(name,age);//调用父类的构造方法,因为这两个属性的权限是private,对name,age做的初始化对子类不管用
//下面这样是对子类属性赋值
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return this.name + ":" + this.age;
}
}
public class OOPTest {
public static void main(String[] args) {
Father f = new Father("lisi", 12);
System.out.println(f.getName());
Sub s = new Sub("zhangsan", 19);
System.out.println(s.getAge());//打印出19
System.out.println(s.getName());//打印出张三
}
}
复制代码
作者:
追忆似水年华
时间:
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)一句代码按顺序做下面四件事:
找到Father.class文件并加载到内存中
在堆内存中为Father对象分配内存地址,开辟内存空间
在第2步开辟的空间内建立Father对象的属性,并进行默认初始化,String类型初始化为null,int类型初始化为0
执行Father类的构造函数中的代码,此函数内的this指向Father对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2