1、若是一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?ide
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定义在代码块以前: this
若在代码块后面:spa
能够得出结果:构造函数的优先级最高,最后必定执行构造函数。设定了字段的初始值与代码块的优先级相同,在没有构造函数的状况下,按照顺序依次执行,获得后面的结果。3d
2、静态方法中只容许访问静态数据,那么,如何在静态方法中访问类的实例成员?code
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(); } }
能够经过在静态方法中将一个对象的引用传入到静态方法中,即可以调用该对象的非静态方法。对象
3、使用类的静态字段和构造函数,能够跟踪某个类所建立对象的个数。请写一个类,在任什么时候候均可以向它查询“你已经建立了多少个对象?”。blog
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 }
运行结果:it
4、 对象判等:编译
运行结果为false
当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等 当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
两个对象的“内容”,实际上是指它们在某一时刻的全部字段的值,“内容相等”,实际上是就“对应字段值”一致。 在Java中要比对两个对象的字段值,能够 “重写(override)”基类的equals()方法。
5、装箱与拆箱问题:
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的对象,故不相等。