1. 程式人生 > >Java第三章整理

Java第三章整理

static 聲明 進行 數字 num rri 如果 rgs 訪問類

1.不一樣。前者為“原始數據類型”,諸如int,float之類的變量;後者為“引用類型”變量,“引用”一個對象的變量稱為“引用類型”的變量,有時又簡稱為“對象變量”。從變量與內存分配上講,當聲明一個對象類型的變量時,實際上並沒有創建一個對象,此變量=null。定義一個原始類型的變量時,會馬上給其分配內存。從變量的初始化上講,在定義原始變量時,Java要求必須顯式初始化變量;而對象變量的初始化:對象變量如果不引用一個真實的對象,則必須聲明為null。

2.對象變量也可以使用“==”判斷兩變量值是否相等嗎?

public class T {
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 T {
public static void main (String[] args){
Foo obj1=new Foo();
Foo obj2=new Foo();
System.out.println(obj1.value==obj2.value);
}
}
class Foo{
int value=100;
}

技術分享

當“==”施加於原始數據類型變量時,是比較變量所保存的數據是否相等 當“==”施加於引用類型變量時,是比較這兩個變量是否引用同一對象。 引用代表地址,所以“==”實際上相當於比較兩個引用類型變量中保存的對象地址是否相同

3.如何比較兩個對象的內容是否一樣?

兩個對象的“內容”,其實是指它們在某一時刻的所有字段的值,“內容相等”,其實是就“對應字段值”一致。

在Java中要比對兩個對象的字段值,可以 “重寫(override)”基類的equals()方法

4.以下代碼為何無法通過編譯?哪兒出錯了?

public class Test {

public static void main(String[] args) {
// TODO Auto-generated method stub
Foo obj1 = new Foo();
}
}
class Foo{
int value;
public Foo(int initValue){
value=initValue;
}
}

如果類提供了一個自定義的構造方法,將導致系統不再提供默認構造方法。所以可以將“Foo obj1 = new Foo();”改為“Foo obj1 = new Foo(4);”。

5.如果一個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?

在“public int field = 100;”在“{field=200;}”之前時,是“{field=200;}”說了算;在之後時,是“public int field = 100;”說了算。也就是誰比較靠後就是誰初始化起作用。執行類成員定義時指定的默認值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。執行類的構造函數。類的初始化塊不接收任何的參數,而且只要一創建類的對象,它們就會被執行。因此,適合於封裝那些“對象創建時必須執行的代碼”。

6.使用上頁幻燈片中定義的類,以下代碼輸出結果是什麽?

運行結果分為兩部分:

①“public int field = 100;”在“{field=200;}”之前

②“public int field = 100;”在“{field=200;}”之後

java字段初始化的規律:所有類的變量都默認初始化為null,比如String a; Integer b;數字類的原始數據類型默認初始化為0,比如int a; short b; char c;boolean默認初始化為false;

7.運行截圖如下

技術分享

靜態初始化塊的執行順序:父類的靜態初始化塊 子類的靜態初始化塊 父類的初始化塊 父類的構造函數 子類的初始化塊 子類的構造函數

8.靜態方法中只允許訪問靜態數據,那麽,如何在靜態方法中訪問類的實例成員(即沒有附加static關鍵字的字段或方法)?

public class Text3
{
 int x = 3;//類的實例變量,初始化值為3
 static int  y = 4;//類的靜態變量,初始化值為4
 public static void method()//靜態方法
  {   
   System.out.println("實例變量x = " + new Text3().x);//在靜態方法中訪問類的實例變量需首先進行類的實例化
   System.out.println("靜態變量y = " + y);//在靜態方法中可直接訪問類的靜態變量
  }

 public static void main(String[] args) 
    {
     Text3.method();
     Text3 ex = new Text3();
        System.out.println("x = " + ex.x);
        System.out.println("y = " + ex.y);
    }
}

技術分享


9.使用類的靜態字段和構造函數,我們可以跟蹤某個類所創建對象的個數。請寫一個類,在任何時候都可以向它查詢“你已經創建了多少個對象?”

public class Text1
{
public static int num;//靜態字段
public Text1()
{
num++;
System.out.printf("你已經創建了%d個對象\n",num);
}//構造函數
public static void main(String[] args)
{
num=0;
Text1 a=new Text1();
Text1 b=new Text1();
Text1 c=new Text1();

}
}

技術分享

Java第三章整理