一、如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
1 public class InitializeBlockDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 InitializeBlockClass obj=new InitializeBlockClass(); 9 System.out.println(obj.field); 10 11 obj=new InitializeBlockClass(300); 12 System.out.println(obj.field); 13 } 14 15 } 16 17 class InitializeBlockClass{ 18 //下面这句在初始化块之前与之后,会影响到field字段的初始值 19 //public int field=100; 20 21 { 22 field=200; 23 } 24 public int field=100; 25 public InitializeBlockClass(int value){ 26 this.field=value; 27 } 28 public InitializeBlockClass(){ 29 30 } 31 }
运行结果:
若field定义在代码块之前:
若在代码块后面:
可以得出结果:构造函数的优先级最高,最后一定执行构造函数。设定了字段的初始值与代码块的优先级相同,在没有构造函数的情况下,按照顺序依次执行,得到后面的结果。
二、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员?
package TestDemo; public class E { int x=3; public static void f(){ E a=new E(); System.out.println(a.x); } public static void main(String[] args) { E x=new E(); x.f(); } }
可以通过在静态方法中将一个对象的引用传入到静态方法中,便可以调用该对象的非静态方法。
三、使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
1 package TestDemo; 2 3 public class E { 4 static int x=0; 5 E(){ 6 x++; 7 } 8 9 void f() { 10 System.out.println("你共创建了"+x+"个"); 11 } 12 public static void main(String[] args) { 13 E a=new E(); 14 a.f(); 15 E b=new E(); 16 E c=new E(); 17 E d=new E(); 18 d.f(); 19 } 20 }
运行结果:
四、 对象判等:
运行结果为false
当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等 当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
两个对象的“内容”,其实是指它们在某一时刻的所有字段的值,“内容相等”,其实是就“对应字段值”一致。 在Java中要比对两个对象的字段值,可以 “重写(override)”基类的equals()方法。
五、装箱与拆箱问题:
public static void main(String[] args) { int value=100; Integer obj=value; //装箱 int result=obj*2; //拆箱 }
简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
反编译结果:
可以看到分别调用了 Integer.valueOf();和 Integer.intValue();方法
看如下代码:
两对整数明明完全一样,为何一个输出true,一个输出false?
解答:
反编译
方法 Integer.valueOf();源代码:
public static Integer valueOf(int i) { return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128]; }
可以看到,当i不符合范围时为创建一个Integer的对象,故不相等。