3类与对象

 一、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,即超出有效范围,无法正常比较。

原文地址:https://www.cnblogs.com/watm/p/7687497.html