java中子类继承父类,实例化子类前要先为父类初始化的问题~
在实例化子类的对象前要先实例化父类中的内容,为父类初始化~我能不能这样理解?A为父类B为子类Aa=newB();//这个向上转型的操作,是不是就可以认为是同时为父类和子类...
在实例化子类的对象前要先实例化父类中的内容,为父类初始化~
我能不能这样理解?
A为父类 B为子类
A a = new B(); //这个向上转型的操作,是不是就可以认为是 同时为父类和子类都初始化了呢?
//然后A中的对象a,B中的对象b是不是都可以直接使用了?
还是说在实例化子类的对象前要先实例化父类中的内容,为父类初始化~的意思是:
A a = new A();
B b = new B(); 展开
我能不能这样理解?
A为父类 B为子类
A a = new B(); //这个向上转型的操作,是不是就可以认为是 同时为父类和子类都初始化了呢?
//然后A中的对象a,B中的对象b是不是都可以直接使用了?
还是说在实例化子类的对象前要先实例化父类中的内容,为父类初始化~的意思是:
A a = new A();
B b = new B(); 展开
5个回答
展开全部
不是这个意思。所谓“实例化子类的对象前要先实例化父类中的内容,为父类初始化”,是指当子类正在实例化时,总是链式调用父类构造方法初始化父类空间。换句话说,子类的构造方法必须先调用父类的构造方法,完了才能干别的初始化工作。如果子类没有显式调用语句,编译器会隐式帮你加上。
如:
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是个空引用。
}
}
除此之外,代码中体现这个语言特性的机会很少。
或者说,要很直白的体现“子类实例化之前必须先实例化父类”除非把实例化的过程拖得很长,使得对象的实例化迟迟维持在半成品状态,这显然不是个好的设计。这意味着,如果非要“体现”,那通常这就是一个坑。
展开全部
你要明白,new B()的实际是调用了构造方法。而子类的构造方法一定会调用父类的构造方法的。所以你在new B() 的时候,实际上同时也调用了父类的构造方法 new A()。
追问
所以我可以把这句A a = new B(); 的意思理解为就是实例化子类前先实例化父类吗?
追答
对啊, 而你的A a = new B(); 其中的a只是一个引用,真正的对象可以理解为是 new B();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以理解为子类实际上是父类+扩展
实例化子类的时候 是先初始化父类再初始化扩展
实例化子类的时候 是先初始化父类再初始化扩展
追问
这个我明白~我只是想明白实际写代码的时候 哪个代码是体现这句话的~
追答
如果你非要想看到 可以写一个子类然后让eclipse帮你生成默认的构造方法
你会看到这样的一个东西
public ClassName() {
super();
}
而且你在super();之前是不能添加任何代码的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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..");
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
A a = new B(),只初始化了子类
追问
实例化子类前要先为父类初始化这句话如果要在程序中体现难道是
A a = new A();
B b = new B();这样?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询