注意:这个为小白编程调试记录,里面有些代码不是正确的,仅仅是个记录!!!!!
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(内存分析)。所以笔者用了两个不同的对象名做区分。