Java第六周课堂示例总结

一、如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

 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的对象,故不相等。

猜你喜欢

转载自www.cnblogs.com/dongao/p/11674246.html