关于JAVA继承类的一道笔试题

classX{Yb=newY();X(){System.out.print("X");}}classY{Y(){System.out.print("Y");}}publi... class X
{
Y b=new Y();
X()
{
System.out.print("X");
}
}
class Y
{
Y()
{
System.out.print("Y");
}
}
public class Z extends X
{
Z()
{
System.out.print("Z");
}
Y y=new Y();
public static void main(String[] args)
{
new Z();
}
}
其执行结果是YXYZ,我想知道,为什么,我把class X里的代码顺序换一下,执行结果依然是YXYZ,我想了解一下构造函数的调用过程。谢谢:)
class X
{
X()
{
System.out.print("X");
}
Y b=new Y();
}
展开
 我来答
仲夏灬夜之雨
2012-03-07 · TA获得超过516个赞
知道小有建树答主
回答量:132
采纳率:100%
帮助的人:85.6万
展开全部
构造函数都是先执行构造 再执行其他的.像你的class X 你去用无参构造器new一个X时,他会先调用你重写的无参构造器,如果自己没写jvm会去调用默认的,默认的无参数构造器是默认就存在的不论你写不写.执行构造函数时他会先执行你构造方法的代码,执行完成后才会去执行其他方法 去生成这个类的属性 执行静态代码块,class X中的 Y b=new Y(); 这段代码你放哪里其实只是声明了一个X的成员变量而已,放哪里执行顺序都是一样的
追问
谢谢你,可是你好,我想的也是先执行构造方法,因为new Z(),Z是继承于X的,我先执行X的构造函数,不是要先打印X出来么,可为什么是Y先呢?
追答
这个逻辑是对的,但是凡是new出来的成员变量是先于构造器里的代码执行的.在单步调试测试后,结果就是:成员变量会在执行构造函数开始时就去声明出来,例如有如下几个属性
private String a;
private String b=new String();
在new该类的时候,进入构造函数的时候会调用系统默认的方法先检测该类的属性声明,如果属性中有new 出现,那么依次执行属性的构造方法,成员变量即属性声明完成后继续构造方法中,自定义的方法!

class X {
T t=new T();//@
Y b = new Y();
X() {
System.out.print("X");
}
}
class T {
T() {
System.out.print("T");
}
}

class Y {
Y() {
System.out.print("Y");
}
}

public class Z extends X {
Z() {
System.out.print("Z");
}

Y y = new Y();

public static void main(String[] args) {
new Z();
}
}
这个程序的执行结果是:TYXYZ,@处换一下位置就会出现不同的结果
class X {
Y b = new Y();//@
T t=new T();
X() {
System.out.print("X");
}
}
class T {
T() {
System.out.print("T");
}
}

class Y {
Y() {
System.out.print("Y");
}
}

public class Z extends X {
Z() {
System.out.print("Z");
}

Y y = new Y();

public static void main(String[] args) {
new Z();
}
结果为:YTXYZ
zpf9902
2012-03-07
知道答主
回答量:10
采纳率:0%
帮助的人:8786
展开全部
class X
{
Y b=new Y("x");
X()
{
System.out.print("X");
}
}
class Y
{
Y(String t)
{
System.out.print(t+"Y/");
}
}
public class Z extends X
{
Z()
{
System.out.print("Z");
}
Y y=new Y("z");
public static void main(String[] args)
{
new Z();
}
}

执行结果是:xY/XzY/Z,你自己看看,想想吧,嘿嘿
追问
我按照先执行构造函数得出的结果是XxY/ZzY/ 我还是不明白,我用eclipse去运行了代码,得出结果确实是xY/XzY/Z,那我的理解就是,比如在
class X
{
Y b=new Y("x");
X()
{
System.out.print("X");
}
}
里边,不管Y b=new Y("x") 和X()书写的顺序如何,都是Y b=new Y("x")被先执行,是这样理解的么?谢谢啦~打扰了。
追答
是的,你的理解没问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
2002a201
2012-03-07 · TA获得超过281个赞
知道答主
回答量:35
采纳率:0%
帮助的人:11.9万
展开全部
咱们先搞清楚程序执行过程把,我写在你的程序上标出程序输出过程把:
class X
{
Y b=new Y(); // **********************第一个输出
X()
{
System.out.print("X"); // **********第二个输出
}
}
class Y
{
Y()
{
System.out.print("Y");
}
}
public class Z extends X
{
Z()
{
System.out.print("Z");
}
Y y=new Y(); // *** ***************************第三个输出
public static void main(String[] args)
{
new Z(); // 第四个输出
}
}
第一个知识点:继承。子类继承父类,程序执行的过程中先加载用父类,这也是出现重写的原因。所以程序先加载了类X。
第二个知识点:因为java程序在执行时先加载全局变量。在X类中的成员变量是Y b = new Y();在程序加载b 时需要调用类Y的无参构造方法,就输出了Y。
第三个知识点:构造器。程序调用默认调用的是构造器是无参构造器,所以在继承类X时,程序先执行了X的无参构造器输出x(当给这个参构造器有参数时就不会输出x)。当new一个对象时就是调用这个类的构造器。第三个输出和第四个输出和上面类似。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
达内
2021-04-27 · 百度认证:教育领域创作者
达内
向TA提问
展开全部

本视频主要从Java语言基础、JavaSE核心、WEB全栈及数据库、Servlet/Jsp核心、 Java框架五个阶段进行讲解。在本教程中,会让大家从零基础快速掌握Java知识。想要配套学习资料的小伙伴可以联系我哦!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式