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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沙漠里的小鱼 黑马帝   /  2013-2-8 16:25  /  1898 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如一个父类  class A{
private C c;   //C是一个接口类型的
public A(C c){
this.c=c}
}
一个子类 class B extends A{
private C c;
public B(C c){
super(c);
this.c=c//这里是不是还有必要写this.c=c这句话   我感觉没必要写了  请各位指教 谢谢
}
}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

19 个回复

倒序浏览
没有必要吧,因为你已经继承了,你super(c);
直接调用父类的了!
private C c;   //C是一个接口类型的
public A(C c){
this.c=c}
}
一个子类 class B extends A{
private C c;
public B(C c){
super(c);
this.c=c//这里是不是还有必要写this.c=c这句话   我感觉没必要写了  请各位指教 谢谢
}
}
class B extends A,你这句直接继承了class A,也就是B的父类,它父类构造了一个C接口类型的构造函数,你super(c),就可以调用父类的了,你这里写
this.c = c多余了,直接用父类的!
回复 使用道具 举报
A既然已经继承B了,那么就可以用父类中的成员了啊。但是恰恰c是private的,所以子类的B是不能直接访问不到父类A中的c的;然而在初始化子类B的对象的时候,是会先初始化父类中的c的,会在内存中存在两个c的。
但是你又通过构造父类A的构造函数可以让子类访问到了c。所以若是子类需要使用接口C的话,是能通过父类访问那个c的,然而是使用了父类中的初始化c的结果。
如果你的子类还需要重新对c初始化,是需要加上this.c=c的。关键看你要怎么用这个接口C中的成员了。
一句话说:你要是用父类初始化后的c,可以不用加上这条语句,要是子类还需对c初始化使用,就需要加上这句话。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黄玉昆 发表于 2013-2-8 18:44
A既然已经继承B了,那么就可以用父类中的成员了啊。但是恰恰c是private的,所以子类的B是不能直接访问不到 ...

你说的不错  可是我还是不太明白 能讲的简单点吗  什么叫  :你要是用父类初始化后的c,可以不用加上这条语句,要是子类还需对c初始化使用,就需要加上这句话  很疑惑 谢谢
回复 使用道具 举报
沙漠里的小鱼 发表于 2013-2-8 19:37
你说的不错  可是我还是不太明白 能讲的简单点吗  什么叫  :你要是用父类初始化后的c,可以不用加上这条 ...

我的意思就是说,你在加载子类对象的时候,是要先初始化父类中的成员的,就是那句super(c)。如果子类使用父类初始化了的c,觉得这个c用得合适,就可以不用自己在费劲加上this.c = c,再对c初始化了。但是如果子类使用父类初始化的c,觉得这个c用着不爽,就需要加上this.c = c,再次进行初始化。不知道我这么说你是否明白了?我记着是在毕老师的一个视频中听他讲的,具体是哪天的,不记得了。
回复 使用道具 举报
小程序一个,实验了下,可以看出有无必要。

  1. public class Jichenglx {
  2. public static void main(String[] args) {
  3. B b = new B("String");
  4. System.out.println("B:"+b.bgetS()+" A:"+b.agetS());
  5. }

  6. }
  7. class A{
  8. private String s;
  9. public A() {
  10. }
  11. public A(String s)
  12. {
  13. this.s=s;
  14. }
  15. public String agetS()//获取A中s
  16. {
  17. return s;
  18. }
  19. public String toString() {
  20. return s;
  21. }
  22. }
  23. class B extends A{
  24. private String s;
  25. public B(String s)
  26. {
  27. super(s);//注释此句 结果为:B:String A:null
  28. this.s=s;//注释此句 结果为:B:null A:String
  29. //两句都不注释:B:String A:String
  30. }
  31. public String bgetS()//获取b中s
  32. {
  33. return s;
  34. }
  35. public String toString() {
  36. return s;
  37. }
  38. }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
李培根 + 9 赞一个!

查看全部评分

回复 使用道具 举报
张向辉 发表于 2013-2-8 21:00
小程序一个,实验了下,可以看出有无必要。

我想请问下你试验的结果是什么啊
回复 使用道具 举报
本帖最后由 张向辉 于 2013-2-9 15:01 编辑
沙漠里的小鱼 发表于 2013-2-8 22:45
我想请问下你试验的结果是什么啊


我把你程序里的接口成员变量换成了String变量,在主函数中分别调用父类和子类的成员变量,父类this.c=c为父类成员变量赋值,子类this.c=c为子类成员变量赋值。如果去掉子类中this.c=c;那么子类中成员变量为空。所以有无必要,看你的需求。
回复 使用道具 举报
张向辉 发表于 2013-2-9 14:58
我把你程序里的接口成员变量换成了String变量,在主函数中分别调用父类和子类的成员变量,父类this.c=c为 ...

请教一下  构造函数是初始化对象用的   super(c) 是给父类的成员变量赋值   那给父类的成员变量赋值有什么用呢   后面我们又this.c=c 这是给子类成员变量赋值     我们比如new一个子类对象 比如new B(c)  我们super(c)把父类的成员变量设置为c  然后又this.c=c又把子类的成员变量设置为c有什么用呢  谢谢
回复 使用道具 举报
黄玉昆 发表于 2013-2-8 18:44
A既然已经继承B了,那么就可以用父类中的成员了啊。但是恰恰c是private的,所以子类的B是不能直接访问不到 ...

请教一下  构造函数是初始化对象用的   super(c) 是给父类的成员变量赋值   那给父类的成员变量赋值有什么用呢   后面我们又this.c=c 这是给子类成员变量赋值     我们比如new一个子类对象 比如new B(c)  我们super(c)把父类的成员变量设置为c  然后又this.c=c又把子类的成员变量设置为c有什么用呢  谢谢
回复 使用道具 举报
打个比方吧,可能不太合适啊:
一个父亲,还没孩子的时候,自己骑自行车好几十年了。有了孩子后,就教孩子骑自行车,孩子长大了,会开汽车了。孩子要去超市(离家不太远)买水果,你说怎么去合适呢?当然骑自行车方便了,所以,孩子觉得骑自行车就行了,那就用父亲的自行车就行了。可是,父子俩要买年货去。这时候,你说怎么去合适呢?当然开车去方便了。孩子要先想想,既然买年货,看看父亲的那个代步工具行不行?不行,好,还是用自己的汽车吧,于是用用自己的汽车代替父亲的自行车。
我的那个有没有必要自己初始化就差不多是这个意思。
回复 使用道具 举报
张向辉 发表于 2013-2-9 14:58
我把你程序里的接口成员变量换成了String变量,在主函数中分别调用父类和子类的成员变量,父类this.c=c为 ...

我还是不太明白 我今天请教了一下别人 测试了一下  写了super(c); 就没必要写this.c=c  因为结果测试正确
回复 使用道具 举报
黄玉昆 发表于 2013-2-10 14:43
打个比方吧,可能不太合适啊:
一个父亲,还没孩子的时候,自己骑自行车好几十年了。有了孩子后,就教孩子 ...

我还是不太明白 我今天请教了一下别人 测试了一下  写了super(c); 就没必要写this.c=c  因为结果测试正确
回复 使用道具 举报
必须要写啊,你父类初始化完毕后,子类还初始化不了?必须要初始化啊,子类初始化,不写this.,他知道给谁初始化啊,换句话说,局部的c就把值赋给局部的c的,跟外部的c没一点关系,如果你把this.去掉,相当于把this.c = c去掉了,,,,,,
回复 使用道具 举报
本帖最后由 张向辉 于 2013-2-14 21:08 编辑
沙漠里的小鱼 发表于 2013-2-14 20:17
我还是不太明白 我今天请教了一下别人 测试了一下  写了super(c); 就没必要写this.c=c  因为结果测试正确 ...


你的程序最终需要实现什么功能啊,如果程序始终都没用到子类成员变量,就没有必要给子类B定义成员变量。
  1. class A{
  2. private C c;   //C是一个接口类型的
  3. public A(C c){
  4. this.c=c}
  5. }
  6. 一个子类 class B extends A{
  7. //private C c; 既然没有用 去掉就好了
  8. public B(C c){
  9. super(c);
  10. //this.c=c  这里就不用赋值了
  11. }
  12. }
复制代码
回复 使用道具 举报
我觉得正常开发中,你父类已经有了一个字段C c,子类直接继承用这个c就ok了,不会在重新定义一个。你这样写用于实验理解继承是可以的,要是正儿八经搞代码,不建议这样做~,因为它属于过度定义;如果我跟你合作,你这样写代码,我会跟你拼命的。至于你那句有没有必须写,张斑竹已经说的很清楚了,写肯定是有效果的,但是你子类中又定义c有意义吗?
回复 使用道具 举报
黄玉昆 发表于 2013-2-8 18:44
A既然已经继承B了,那么就可以用父类中的成员了啊。但是恰恰c是private的,所以子类的B是不能直接访问不到 ...

很感谢你这么详细的给我这个菜鸟解答  我的意思是说为什么我们我们实际运行中 new一个对象B  也就是说 B b =new B("hello")
class B extends A {     
String c;      
public B(String c) {        
super(c);        
//this.c = c;     }     
} 就是说我们实际运行肯定都是 new一个B对象   然后我们在写B类的时候加不加this.c=c效果都一样呢
回复 使用道具 举报
张向辉 发表于 2013-2-14 21:06
你的程序最终需要实现什么功能啊,如果程序始终都没用到子类成员变量,就没有必要给子类B定义成员变量。 ...

很感谢你这么详细的给我这个菜鸟解答  我的意思是说为什么我们我们实际运行中 new一个对象B  也就是说 B b =new B("hello")class B extends A {     
String c;      
public B(String c) {        
super(c);        
//this.c = c;     }     
} 就是说我们实际运行肯定都是 new一个B对象   然后我们在写B类的时候加不加this.c=c效果都一样呢
回复 使用道具 举报
肿么没有人解答一下呢
回复 使用道具 举报
如果你在程序中想使用子类中的成员变量,那你就必须添加this.c=c;这句代码,否则子类的成员变量c就会为空。  因为你父类的成员变量的访问权限是private私有的,子类无法访问。  当然如果你在程序中只需要使用父类成员变量,那么就没必要添加this.c=c;这句代码,但这样子类就失去了意义。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马