黑马程序员技术交流社区
标题:
重金悬赏一个构造函数的基础问题
[打印本页]
作者:
沙漠里的小鱼
时间:
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
怎么说呢?嗯,。先看一小段代码吧!
//你说的基本上是下面这种情况吧!
public interface C{}//接口C
public class A//类A有私有成员 C实例的一个引用。
{
private C c;
public A(C c){this.c = c}
}
public class B extends A
{
public B(C c)
{
//你不懂的是这样做有什么作用是吧?
super(c);
}
}
复制代码
首先,继承的特点不用说了吧,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