一、java字段初始化规律
如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?根据下面代码结果,总结java字段初始化规律。
1 package opinion; 2 public class InitializeBlockDemo { 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 InitializeBlockClass obj=new InitializeBlockClass(); 9 System.out.println(obj.field);//100 10 11 obj=new InitializeBlockClass(300); 12 System.out.println(obj.field);//300 13 } 14 } 15 class InitializeBlockClass{ 16 //下面这句在初始化块之前与之后,会影响到field字段的初始值 17 //public int field=100; 18 19 { 20 field=200; 21 } 22 public int field=100; 23 public InitializeBlockClass(int value){ 24 this.field=value; 25 } 26 public InitializeBlockClass(){ 27 28 } 29 }
结果截图:
类的初始化块:可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员。类的这种“没有名字”的“成员”,多用于初始化类的字段。{value=100;}即为初始化块
100即InitializeBlockClass类中当public int field在初始化块filed=200之后的值100,若在初始化块之前,则输出的值为filed=200;300即为构造方法输出的值。
1执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
2执行类的构造函数。
注:类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
二、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
1 package opinion; 2 public class Interet { 3 int age=0;//实例成员 4 static String name="sherry";//静态成员 5 static void create() 6 { 7 System.out.println("实例成员"+new Interet().age); 8 //在静态方法中访问类的实例变量需首先进行类的实例化 9 System.out.println("静态成员"+name); 10 //在静态方法中可直接访问类的静态变量 推荐使用类名来直接访问静态字段 11 } 12 public static void main(String[]args) 13 { 14 Interet.create(); 15 } 16 }
结果截图:
三、
如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
(本题则无new Foo()无参构造函数)
四、查看以下代码,两对整数明明完全一样,为何一个输出true,一个输出false?
1 public class StrangeIntegerBehavior 2 { 3 4 public static void main(String[] args) 5 { 6 7 Integer i1=127; 8 9 Integer j1=127; 10 11 System.out.println(i1==j1);//true 12 //调用Integer.valueOf(),它的范围为-128~127 13 Integer i2=139; 14 15 Integer j2=139; 16 17 System.out.println(i2==j2);//false 18 }
提示: 使用javap来分析生成class文件,看它调用了Interger类的哪个方法,然后打开JDK源文件查看源码,就可以找到答案。
经查验,发现其调用Integer.valueof(),其范围为-128~127,即超出有效范围,无法正常比较。