动手动脑(二)

引用类型 vs 原始数据类型

“引用”一个对象的变量称为“引用类型”的变量,有时又简称为“对象变量”。例:MyClass obj = new MyClass();

诸如int,float之类的变量称为“原始数据类型”的变量。例:int value=100;

变量与内存分配

当声明一个对象类型的变量时,实际上并没有创建一个对象,此变量=null。例:MyClass obj=null,此时obj为null。

定义一个原始类型的变量时,会马上给其分配内存。例:int value=100,此时value为100。
对于原始数据类型的变量(比如int),可以直接使用“==”判断两变量值是否相等?

测试两个对象变量
例:public class Test {
       public static void main(String[] args) {
             Foo obj1=new Foo();
             Foo obj2=new Foo();
             System.out.println(obj1==obj2);
       }

}
class Foo{
       int value=100;
}
运行结果:

 

 测试两个原始数据类型的变量
public class Test {
        public static void main(String[] args) {
               int value1=100;
               int value2=100;
              System.out.println(value1==value2);
       }

}
运行结果:

 由上述实践得知:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等。

         当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

            引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

 

 报错The constructor Test.Foo() is undefined 翻译: 构造函数 Test.Foo()未定义。
结论:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

多构造函数

同一个类可以有多个构造函数,多个构造函数之间通过参数来区分。这是方法重载的一个实例。 构造函数之间可以相互调用。

 

 

 

 运行结果:

得出结论:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。

运行下面的代码,观察输出结果,总结出“静态初始化块的执行顺序”。

 1 class Root
 2 {
 3     static
 4     {
 5         System.out.println("Root的静态初始化块");
 6     }
 7     {
 8         System.out.println("Root的普通初始化块");
 9     }
10     public Root()
11     {
12         System.out.println("Root的无参数的构造器");
13     }
14 }
15 class Mid extends Root
16 {
17     static
18     {
19         System.out.println("Mid的静态初始化块");
20     }
21     {
22         System.out.println("Mid的普通初始化块");
23     }
24     public Mid()
25     {
26         System.out.println("Mid的无参数的构造器");
27     }
28     public Mid(String msg)
29     {
30         //通过this调用同一类中重载的构造器
31         this();
32         System.out.println("Mid的带参数构造器,其参数值:" + msg);
33     }
34 }
35 class Leaf extends Mid
36 {
37     static
38     {
39         System.out.println("Leaf的静态初始化块");
40     }
41     {
42         System.out.println("Leaf的普通初始化块");
43     }    
44     public Leaf()
45     {
46         //通过super调用父类中有一个字符串参数的构造器
47         super("Java初始化顺序演示");
48         System.out.println("执行Leaf的构造器");
49     }
50 
51 }
52 
53 public class TestStaticInitializeBlock
54 {
55     public static void main(String[] args) 
56     {
57         new Leaf();
58         
59 
60     }
61 }

运行结果:

结论:静态初始化块只执行一次。

     创建子类型的对象时,也会导致父类型的静态初始化块的执行。

 

 




 

 

 

 


| | | | | ---- | ---- | ---- | | | | || | | | | ---- | ---- | ---- | | | | |
posted @ 2022-10-10 20:10  万事胜意k  阅读(16)  评论(0编辑  收藏  举报