java中子类继承父类,实例化子类前要先为父类初始化的问题~

在实例化子类的对象前要先实例化父类中的内容,为父类初始化~我能不能这样理解?A为父类B为子类Aa=newB();//这个向上转型的操作,是不是就可以认为是同时为父类和子类... 在实例化子类的对象前要先实例化父类中的内容,为父类初始化~
我能不能这样理解?
A为父类 B为子类

A a = new B(); //这个向上转型的操作,是不是就可以认为是 同时为父类和子类都初始化了呢?
//然后A中的对象a,B中的对象b是不是都可以直接使用了?

还是说在实例化子类的对象前要先实例化父类中的内容,为父类初始化~的意思是:
A a = new A();
B b = new B();
展开
 我来答
JINLegend
推荐于2017-09-04 · TA获得超过802个赞
知道小有建树答主
回答量:241
采纳率:100%
帮助的人:126万
展开全部

不是这个意思。所谓“实例化子类的对象前要先实例化父类中的内容,为父类初始化”,是指当子类正在实例化时,总是链式调用父类构造方法初始化父类空间。换句话说,子类的构造方法必须先调用父类的构造方法,完了才能干别的初始化工作。如果子类没有显式调用语句,编译器会隐式帮你加上。

如:

public class A
{
    public A()
    {
    }
}
public class B extends A
{
    public B()
    {
    }
}

等价于:

public class A
{
    public A()
    {
        super();//这里实际上是Object();
        //其他初始化工作
    }
}
public class B extends A
{
    public B()
    {
        super();//这里实际上是A();
        //其他初始化工作
    }
}

另外,如果有这种情况:

public class A
{
    X x=new X();
    public A()
    {
    }
}
public class B extends A
{
    Y y=new Y();
    public B()
    {//这是类A空间里的字段都已经初始化完毕。
    }
}

在成员y被赋值之前,x一定已经存在。换句话说,X x=new X();一定先于Y y=new Y();执行。

追问
也就是说这句话只是对工作原理的一个描述。。。没有实际的语句能反映他的存在
A a = new B(); 这个向上转型的操作,其实跟子类实例化之前必须先实例化父类的关系不大,对吗?
追答

它既是工作原理,也是语言特性或语言层面上的基本要求。它本身不是一个操作指令或语句。

A a = new B();

这个操作里当进行到赋值给A a时,实例化工作已经全部圆满结束,跟“跟子类实例化之前必须先实例化父类”没关系了。


一般来说,我们可以不用了解这句话也通常不影响我们的编程工作,但在某些特殊情况下可能会踩坑(我自己就踩过),应当注意。

比如:

public abstract class A
{
    public A()
    {
        OnInit();
    }
    public abstract void OnInit();
}
public class B extends
{
    X x=new X();
    @Override
    public void OnInit()
    {
        x.XXX();//Error!因为A构造方法会调用此方法,此时A的空间还没初始完毕,X x=new X();还没执行。于是x是个空引用。
    }
}

除此之外,代码中体现这个语言特性的机会很少。

或者说,要很直白的体现“子类实例化之前必须先实例化父类”除非把实例化的过程拖得很长,使得对象的实例化迟迟维持在半成品状态,这显然不是个好的设计。这意味着,如果非要“体现”,那通常这就是一个坑。

黄沙农夫山
2014-03-04 · 超过11用户采纳过TA的回答
知道答主
回答量:32
采纳率:0%
帮助的人:27.2万
展开全部
你要明白,new B()的实际是调用了构造方法。而子类的构造方法一定会调用父类的构造方法的。所以你在new B() 的时候,实际上同时也调用了父类的构造方法 new A()。
追问
所以我可以把这句A a = new B(); 的意思理解为就是实例化子类前先实例化父类吗?
追答
对啊, 而你的A a = new B(); 其中的a只是一个引用,真正的对象可以理解为是 new B();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
samplezuo
2014-03-04 · TA获得超过320个赞
知道小有建树答主
回答量:452
采纳率:100%
帮助的人:256万
展开全部
你可以理解为子类实际上是父类+扩展
实例化子类的时候 是先初始化父类再初始化扩展
追问
这个我明白~我只是想明白实际写代码的时候 哪个代码是体现这句话的~
追答
如果你非要想看到 可以写一个子类然后让eclipse帮你生成默认的构造方法
你会看到这样的一个东西

public ClassName() {
super();
}
而且你在super();之前是不能添加任何代码的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友dfd5459
2014-03-04 · TA获得超过365个赞
知道小有建树答主
回答量:358
采纳率:0%
帮助的人:284万
展开全部
public class A {
public A() {
System.out.println("初始化A..");
}

public static void main(String[] args) {
B a = new B();
}
}

class B extends A {
public B() {
System.out.println("初始化B..");
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
佛曰你好吗
2014-03-04 · TA获得超过144个赞
知道答主
回答量:125
采纳率:50%
帮助的人:46.1万
展开全部
A a = new B(),只初始化了子类
追问
实例化子类前要先为父类初始化这句话如果要在程序中体现难道是
A a = new A();
B b = new B();这样?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式