2021年02月08日除錯筆記Java類和物件(二)
阿新 • • 發佈:2021-02-09
注意:這個為小白程式設計除錯記錄,裡面有些程式碼不是正確的,僅僅是個記錄!!!!!
3.程式設計思路:
這次主要的知識點是物件可以作為屬性放到另一個物件裡面去。
建立PetDog類和People類。每一個寵物狗都有一個主人,每個人有名字,寵物狗也有名字,並且可以叫。定義了cry方法。
程式碼如下:
public class PetDog {
String name;
People owner;
void cry(){
System.out.println("wangwangwangwang!" );
}
public static void main(String[] args) {
People owner1=new People();
owner1.name="Mickey";
PetDog Dog1=new PetDog();
Dog1.name="Pluto";
Dog1.owner=owner1;
System.out.println(Dog1.name+"'s owner is "+owner1.name);
Dog1. cry();
People owner2=new People();
owner1.name="William";
PetDog Dog2=new PetDog();
Dog1.name="Pango";
Dog1.owner=owner2;
System.out.println(Dog2.name+"'s owner is "+owner2.name);
Dog2.cry();
}
}
class People
{
String name;
}
執行結果
從上面可以看出,第二對狗和主人的資訊並沒有打印出來。
原因分析:
問題出在這個程式碼上:
owner1.name="William";
PetDog Dog2=new PetDog();
Dog1.name="Pango";
Dog1.owner=owner2;
System.out.println(Dog2.name+"'s owner is "+owner2.name);
由於當時打第二塊程式碼的時候是複製貼上上去的,物件名忘了改,所以把字串的資訊賦值給了Dog1物件,而Dog2物件被無參構造器初始化了預設值,而String類的預設值為null(String類也是物件),所以第二行輸出了null。
修改程式碼如下:
public class PetDog {
String name;
People owner;
void cry(){
System.out.println("wangwangwangwang!");
}
public static void main(String[] args) {
People owner1=new People();
owner1.name="Mickey";
PetDog Dog1=new PetDog();
Dog1.name="Pluto";
Dog1.owner=owner1;
System.out.println(Dog1.name+"'s owner is "+owner1.name);
Dog1.cry();
People owner2=new People();
owner2.name="William";
PetDog Dog2=new PetDog();
Dog2.name="Pango";
Dog2.owner=owner2;
System.out.println(Dog2.name+"'s owner is "+owner2.name);
Dog2.cry();
}
}
class People
{
String name;
}
執行結果為
總結:
一個物件就是一個整體,物件的屬性也可以是物件,注意在
Dog1.owner=owner1;
中,此owner1非彼owner。一個是Dog1物件內部的屬性,一個是new出來的獨立的物件。這一賦值操作便把Dog1的owner指向了owner1(記憶體分析)。所以筆者用了兩個不同的物件名做區分。