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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

比如一个父类  class A{
private C c;   //C是一个接口类型的
public A(C c){
this.c=c}
}
一个子类 class B extends A{

public B(C c){
super(c);
this.c=c//这句话写上就是在初始化一个对象B 的时候   比如B b=new B(c)  其中这个b的成员变量有值   如果没有写this.c=c 则只能是super.c才有值  我的理解是super(c)是传给父类的构造函数  然后通过父类的构造函数赋值给父类的成员变量   但是把父类的成员变量赋值为c有啥用呢  这个问题纠结我好久了  谢谢你给我的解答
}
}

12 个回复

倒序浏览

回帖奖励 +5

怎么说呢?嗯,。先看一小段代码吧!
  1. //你说的基本上是下面这种情况吧!
  2. public interface C{}//接口C
  3. public class A//类A有私有成员 C实例的一个引用。
  4. {
  5. private C c;
  6. public A(C c){this.c = c}
  7. }
  8. public class B extends A
  9. {
  10. public B(C c)
  11. {
  12. //你不懂的是这样做有什么作用是吧?
  13. super(c);
  14. }
  15. }
复制代码
首先,继承的特点不用说了吧,B继承了A以后呢,它就有了类A的所有属性,这时候B确实不能直接访问这个A的引用,你是不是就觉得一个不能直接访问的属性拿来有什么用呢?它是有用的。在实际开发中,一个类里面不会出现一个没用的成员吧,肯定在父类的方法中有对这个属性的操作,而子类可以调用父类的方法,也就意味着可以间接的操作这个属性了,而反过来说,也就是这个属性的值会对某些方法产生影响。那你觉得不这样的话好吗?
回复 使用道具 举报

回帖奖励 +5

由于父类的类A只有一个构造方法public A(C c),这个构造方法是带参的,所以子类B在构造方法中继承父类构造方法时,必须要以super(c)这个带参数的方法,其实参数c在这里对父类A并没有特殊意义,只是为了语法正确性必须使用带参数的构造方法,因为若使用super()则会出错,父类A中没有无参的构造方法。如果A没有写任何构造方法时,则默认有一个隐性的构造方法public A(){},但是一旦写了构造方法则使用存在的构造方法。
回复 使用道具 举报

回帖奖励 +5

父类中定义了一个私有的成员变量,默认是null,不能被继承,但是代码中,通过子类给这个成员变量赋值了,我感觉要么是父类可以new对象,要么是父类中有使用到成员变量c中的方法
回复 使用道具 举报

回帖奖励 +5

能骗点金币吗{:soso_e120:}
回复 使用道具 举报
李培根 来自手机 金牌黑马 2013-2-20 16:37:46
地板

回帖奖励 +5

大家终于意识到金币的作用了^_^
回复 使用道具 举报

回帖奖励 +5

因为子类在实例化的时候 会先调用父类的构造函数,而这里的父类A就只有一个带参数的构造函数。所以子类构造函数中的隐式super就没法调用父类的构造函数了,但是又必须要用父类的构造函数,所以这里必须写成super(c)。
回复 使用道具 举报
罗理 初级黑马 2013-2-20 17:13:11
8#

回帖奖励 +5

B继承了A,B中也有c的成员变量,但这个c在A中定义的不是私有吗,在B中访问的到吗,this.c怎么来的
回复 使用道具 举报
王昕 中级黑马 2013-2-20 17:16:39
9#

回帖奖励 +5

本帖最后由 王昕 于 2013-2-20 17:18 编辑

状态影响行为,成员变量都是为了影响方法的行为,如果一个方法的行为不受任何成员变量的影响,那这个方法应该设计成静态的,因为和实例无关了嘛。
所以你的c肯定有用,要影响方法的行为,不然c也没有存在的必要了。不过如果你父类用到c的方法全都被子类覆盖过了,那父类的c似乎确实没什么用。
回复 使用道具 举报

回帖奖励 +5

打个酱油
回复 使用道具 举报

回帖奖励 +5

{:soso_e181:}
回复 使用道具 举报
增涨下见识,疑问同八楼。
回复 使用道具 举报
小白学习一下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马