1、请输入并运行以下代码,得到什么结果?
输出结果为false。因为当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象,换句话说,“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。obj1和obj2虽然都是Foo类型的变量,但其指向的空间或者地址不同,所以输出的是false。
2、以下代码为何无法通过编译?哪儿出错了?
如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
3、请依据代码的输出结果,自行总结Java字段初始化的规律。
public class InitializeBlockClass { { field = 200; } public int field = 100; public InitializeBlockClass(int value){ this.field = value; } public InitializeBlockClass(){ } public static void main(String[] args) { InitializeBlockClass obj = new InitializeBlockClass(); System.out.println(obj.field); obj = new InitializeBlockClass(300); System.out.println(obj.field); } }
运行结果为:
如果有多个不同地方对字段进行初始化,那么该字段的最终取值取决于最后一次初始化。
4、请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
class Root { static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root { static{ System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参数的构造器"); } public Mid(String msg) { //通过this调用同一类中重载的构造器 this(); System.out.println("Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { //通过super调用父类中有一个字符串参数的构造器 super("Java初始化顺序演示"); System.out.println("执行Leaf的构造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
运行结果为:
静态初始化块的执行顺序:
1.静态初始化块只执行一次。
2.创建子类型的对象时,也会导致父类型的静态初始化块的执行。
5、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法?请编写代码验证你的猜想。
在静态方法中使用new进行实例化,然后再调用非静态成员。
1 public class Task { 2 public int a = 2; 3 static int b = 3; 4 static void display() 5 { 6 Task t1 = new Task(); 7 System.out.println("a="+t1.a); 8 } 9 public static void main(String[] args) { 10 Task t2 = new Task(); 11 t2.display(); 12 } 13 }
输出结果为: