黑马程序员技术交流社区
标题:
关于继承中子类隐式super关键字的问题!
[打印本页]
作者:
苏格拉底的弟子
时间:
2012-1-4 10:05
标题:
关于继承中子类隐式super关键字的问题!
本帖最后由 苏格拉底的弟子 于 2012-1-4 23:40 编辑
在继承里面有父类和子类,然后子类里面的每个构造函数里都有隐式的super(),我就是很不清楚为什么一定要有super()呢?假如没有的话会有什么问题呢?谁能简单说下 或者举个例子好让我理解的。
作者:
刘基军
时间:
2012-1-4 10:11
个人理解为:没有父亲哪来的儿子,呵呵
作者:
李盈科
时间:
2012-1-4 10:25
面向对象的方法就是要和现实世界相结合的,有父亲才有儿子,没有人从石头里蹦出来的是吧。子类就是说儿子有父亲的特点,可以生出什么样子的儿子,但是只是个模板而已,没有生儿子呢。当主函数生成对象时候这就是生儿子的事实了,生儿子的过程肯定要父亲参与进来,就调用了父亲的每个属性,就是super调用父类构造方法进行初始化,但是儿子肯定会与父亲有不一样的地方,所以子类还需要有自己的构造方法进行初始化属性,对吧?
作者:
杨扬
时间:
2012-1-4 10:45
简单的例子
假设超类有方法 method1(),它可访问自己的私有变量x ;
又假设子类也写了方法 method1(),但是这个method1()不能直接访问x的。子类若需要调用超类的method1()来完成某一任务,子类必须使用super关键字,否则编译器会认为调用的是子类的method1()...
作者:
彭嘉聪
时间:
2012-1-4 10:59
你可以看下Object类,因为他是每个子类的父类,然后在看看每个子类,是不是都存在着父类的方法?
想象一下,我们人类,每一个人都有继承于父母的特点。
这就是java的特别,对类,对象,方法进行整合,从而衍生多态,继承的应用
object类的方法是每个类都应该拥有的,正如我们吃饭睡觉那样,每个人都应该有。
以此类推
子类继承父类,可以创建属于自己特色的类,但是拥有父类的方法,从而稳固了自己的类和对象。
再有,创建某个对象时,都会调用SUPER()语句,对象会取得所有实例变量所需空间,这当然也包括一路继承下来的父类变量。
作者:
罗利民
时间:
2012-1-4 14:28
本帖最后由 罗利民 于 2012-1-4 14:29 编辑
子类继承了父类,其实在new成功一个子类的时候,堆里的那个子类对象里面包含了一个父类对象,因此子类实例里不需声明和定义就可以用父类的方法和属性
反过来想,既然子类的实例对象里包含了父类实例对象,子类继承父类,那肯定是要在构造子类的时候先构造父类,所以在子类的构造函数里会有隐式的super();没有这句是造不出子类的。
例如:
class A
{
int weight;
int depth;
A() // 加了这段编译就成功,否则就失败
{
weight=depth=-1;
}
A(int w,int d)
{
this.weight=w;
this.depth=d;
}
A(int len)
{
weight=depth=len;
}
}
class B extends A
{
int height;
B(int w,int d,int h)
{//隐式的调用A();创建父类实例对象
super.weight=w; //创建的父类的实例对象,才可以用实例变量weight
super.depth=d;
height=h;
}
}
public class test2
{
public static void main(String args[])
{
B b=new B(1,2,3);
System.out.println(b.weight+b.height+b.depth);
}
}
作者:
杨丹丹
时间:
2012-1-4 22:36
如果子类中定义的成员变量同名时,子类就隐藏了从父类继承的成员变量。
当子类中定义了一个方法。并且这个方法的名字、返回类型、参数个数和类型和父类的某个方法完全相同时,
子类从父类继承的这个方法将被隐藏如果在子类中想使用被隐藏的成员变量或方法就可以使用关键字super。
作者:
卢其龙
时间:
2012-1-4 23:30
哈哈,我感觉不用为这事纠结.这里只是语言框架问题
重要的知道她的执行顺序,多写写代码,就明白框架师为什么这样设计了.
作者:
苏格拉底的弟子
时间:
2012-1-4 23:43
好的 还是该多谢谢代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2