黑马程序员技术交流社区

标题: 重金悬赏一个构造函数的基础问题 [打印本页]

作者: 沙漠里的小鱼    时间: 2013-2-20 12:50
标题: 重金悬赏一个构造函数的基础问题
比如一个父类  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有啥用呢  这个问题纠结我好久了  谢谢你给我的解答
}
}


作者: 杨玲    时间: 2013-2-20 14:04
怎么说呢?嗯,。先看一小段代码吧!
  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的引用,你是不是就觉得一个不能直接访问的属性拿来有什么用呢?它是有用的。在实际开发中,一个类里面不会出现一个没用的成员吧,肯定在父类的方法中有对这个属性的操作,而子类可以调用父类的方法,也就意味着可以间接的操作这个属性了,而反过来说,也就是这个属性的值会对某些方法产生影响。那你觉得不这样的话好吗?
作者: 曹春贵    时间: 2013-2-20 14:12
由于父类的类A只有一个构造方法public A(C c),这个构造方法是带参的,所以子类B在构造方法中继承父类构造方法时,必须要以super(c)这个带参数的方法,其实参数c在这里对父类A并没有特殊意义,只是为了语法正确性必须使用带参数的构造方法,因为若使用super()则会出错,父类A中没有无参的构造方法。如果A没有写任何构造方法时,则默认有一个隐性的构造方法public A(){},但是一旦写了构造方法则使用存在的构造方法。
作者: 史政法    时间: 2013-2-20 14:17
父类中定义了一个私有的成员变量,默认是null,不能被继承,但是代码中,通过子类给这个成员变量赋值了,我感觉要么是父类可以new对象,要么是父类中有使用到成员变量c中的方法
作者: 罗正荣    时间: 2013-2-20 14:19
能骗点金币吗{:soso_e120:}
作者: 李培根    时间: 2013-2-20 16:37
大家终于意识到金币的作用了^_^
作者: 胡勇敏    时间: 2013-2-20 17:10
因为子类在实例化的时候 会先调用父类的构造函数,而这里的父类A就只有一个带参数的构造函数。所以子类构造函数中的隐式super就没法调用父类的构造函数了,但是又必须要用父类的构造函数,所以这里必须写成super(c)。
作者: 罗理    时间: 2013-2-20 17:13
B继承了A,B中也有c的成员变量,但这个c在A中定义的不是私有吗,在B中访问的到吗,this.c怎么来的
作者: 王昕    时间: 2013-2-20 17:16
本帖最后由 王昕 于 2013-2-20 17:18 编辑

状态影响行为,成员变量都是为了影响方法的行为,如果一个方法的行为不受任何成员变量的影响,那这个方法应该设计成静态的,因为和实例无关了嘛。
所以你的c肯定有用,要影响方法的行为,不然c也没有存在的必要了。不过如果你父类用到c的方法全都被子类覆盖过了,那父类的c似乎确实没什么用。
作者: 张豪杰    时间: 2013-2-20 23:54
打个酱油
作者: 汪平乐    时间: 2013-2-20 23:55
{:soso_e181:}
作者: 李阳    时间: 2013-2-21 00:30
增涨下见识,疑问同八楼。
作者: 肖永文    时间: 2013-2-22 13:04
小白学习一下!




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