Lab 2 Assignment
题面与所有提及的文件均保存在作者的GitHub中,点击这里查看。
Question 01
1. 注释标记的哪些行会导致编译错误?将错误截图,并说明原因。
第 4 行会编译错误。
|
|
在方法中声明的变量需手动设置初始值后方可正常调用,此处 m
没有赋初始值。
2. 区分变量 x
和 m
,回答谁需要初始化才能使用,为什么
m
需要初始化才能使用,因为它是声明在方法中的局部变量。x
不需初始化即可使用,因为它是声明在类中的全局变量。
Question 02
a. Overload(int m)
与 Overload(double m)
互为重载的构造方法。
正确。
b. int Overload(int m)
与 void Overload(double m)
互为重载的非构造方法。
正确。
c. Overload
类有 2 个构造方法,尝试调用默认构造方法 Overload()
会无法通过编译。
正确。
d. Overload
类有 3 个构造方法。
错误。构造方法无返回值类型,只有前两个方法是合法的构造方法。
Question 03
输出:
|
|
Question 04
1. 这段代码能够证明“在属性定义处初始化的属性,比在方法中初始化的属性先被初始化”吗?
能。 a7
在属性定义处初始化,a8
在方法中初始化,尽管a7
出现于a8
之后,依然被先初始化。
2. 这段代码能够证明“在属性定义处初始化的属性,初始化顺序等同于他们在类定义
中出现的顺序”吗?
能。 a6
、a7
两个非静态属性先后出现,二者也是按照出现顺序先后被初始化。
Question 05
静态属性的初始化顺序均与出现顺序相同,无论是静态变量还是静态初始化块。
- 静态变量 静态变量在类加载时初始化。它们按照在类中出现的顺序进行初始化。
- 静态初始化块 静态初始化块在静态变量初始化同时执行。多个静态初始化块按照它们在类中出现的顺序依次执行。
a3
, a4
, a5
中,a3
,a5
是静态变量、a4
在静态初始化块中被初始化,三者均按照出现顺序a3
- a4
- a5
被初始化。
Question 06
1. 这段代码能够证明“在类的实例第一次被构造、或类的静态属性和静态方法第一次被访问时,JVM 会执行类加载”吗?如果不能,请尝试修改代码并证明。
不能。 需要在每个类的起始处打印执行的提示信息,修改后的代码如下:
|
|
该程序编译运行后输出结果:
|
|
由前三行可知,类被加载的顺序是Initialization
, B
, A
, 与三者第一次被加载的顺序一致,故可以证明“在类的实例第一次被构造、或类的静态属性和静态方法第一次被访问时,JVM 会执行类加载”。
2. 基于static
关键字,带有static
关键字的方法、变量、代码块可以调用什么?反过来,不带有static
关键字的方法、变量、代码块可以调用什么?(带有static
关键字的方法、变量 or 不带有static
关键字的方法、变量 or 都可以)
带有
static
关键字的方法、变量、代码块只能调用其他带有static
关键字的方法、变量、代码块。不带有
static
关键字的方法、变量、代码块可以调用带有static
关键字的方法、变量、代码块,也可以调用其他不带static
关键字的方法、变量、代码块。
Question 07
不可以,其他的外部类不能通过 new Singleton()
来构造一个新的 Singleton
变量。
Question 08
因为
Singleton
类的构造方法是私有的,此类只能在Singleton
类的内部被调用。外部类无法访问这个私有构造方法,因此无法创造更多实例,最多只可能有由Singleton
类自己创造的 1 个实例同时存在。唯一实例在第一次调用
getInstance()
方法时被构造。
Question 09
下列代码可以从外部调用 Singleton
类的 foo()
:
|
|
Question 10
代码见./Q10/TestPerson.java
, 点此跳转
Question 11
代码见./Q11/Solution.java
, 点此跳转