【Java练习题】Java程序的输出 | 第三套(含解析)

举报
海拥 发表于 2022/03/18 16:32:40 2022/03/18
【摘要】 难度等级: 中等预测以下 Java 程序的输出:// 文件名: Test.javaclass Test { int x = 10; public static void main(String[] args) { Test t = new Test(); System.out.println(t.x); }}该程序运行良好并打印 10。在 Java 中,成员可以使用类声明进行初始化。当初...

难度等级: 中等

预测以下 Java 程序的输出:

// 文件名: Test.java
class Test {
	int x = 10;
	public static void main(String[] args) {
		Test t = new Test();
		System.out.println(t.x);
	}
}

该程序运行良好并打印 10。在 Java 中,成员可以使用类声明进行初始化。当初始化值可用并且初始化可以放在一行时,此初始化工作得很好(有关更多详细信息,请参阅此)。例如,以下程序也可以正常工作。

// 文件名: Test.java
class Test {
	int y = 2;
	int x = y+2;
	public static void main(String[] args) {
		Test m = new Test();
		System.out.println("x = " + m.x + ", y = " + m.y);
	}
}

上述程序的输出是“x = 4, y = 2”。y 首先被初始化,然后 x 被初始化为 y + 2。所以 x 的值变成了 4。

当一个成员在类声明和构造函数中都被初始化时会发生什么?考虑以下程序。

// 文件名: Test.java
public class Test
{
	int x = 2;
	Test(int i) { x = i; }
	public static void main(String[] args) {
		Test t = new Test(5);
		System.out.println("x = " + t.x);
	}
}

上述程序的输出是“x = 5”。Java 中使用类声明的初始化类似于C++ 中使用Initializer List 的初始化。所以,在上面的程序中,在构造函数内部赋值的值覆盖了 x 之前的值 2,x 变为 5。
作为练习,预测以下程序的输出。

// 文件名: Test2.java
class Test1 {
	Test1(int x) {
		System.out.println("Constructor called " + x);
	}
}

// 这个类包含一个 Test1 的实例
class Test2 {
	Test1 t1 = new Test1(10);

	Test2(int i) { t1 = new Test1(i); }

	public static void main(String[] args) {
		Test2 t2 = new Test2(5);
	}
}

程序的输出是Constructor called 10 Constructor called 5。

首先在main方法中实例化t2对象。由于局部变量的初始化顺序比构造函数先,首先实例变量(t1),在类Test2中被分配到内存。在这一行中,创建了一个新的 Test1 对象,在类 Test1 中调用构造函数并打印“Constructor called 10”。接下来调用 Test2 的构造函数,并再次创建类 Test1 的新对象并打印“Constructor called 5”。


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。