形象介绍 类的派生的真正价值。
类Pet(宠物)
字段
name ...宠物的名字
mastername ....主人的名字
构造函数
Pet ....设置宠物和主人的名字
方法
getNmae .....确定宠物名字的方法(name的getter方法)
getMaterName ....确定主人名字方法(masterName的getter方法)
introduce ....进行自我介绍的方法
类RobotPet(机器人类型的宠物)
字段
继承类Pet的字段(name和materName)
构造函数
RobotPet .....设置宠物和主人的名字。通过super(....)将设置处理委托给超类Pet的构造函数
方法
introduce .....进行自我介绍的方法。并不继承Pet中的处理,而是进行重写
work ......做家务的方法。家务的种类(打扫/洗衣服/做饭)通过参数指定为数值 0,1,2类RobotPet和类 Pet的方法之间的关系归类如下。
直接继承 .........getName,getMasterName
重写 .......introduce
新添加 .......work
实例如下
超类
class Pet{
private String name; //宠物的名字
private String masterName; // 主人的名字
public Pet(String name,String materName) { //构造函数
this.name=name; // 宠物的名字
this.masterName=materName; //主人的名字
}
public String getName(){ return name; } //确定宠物名字
public String getMasterName() { return masterName;} //确定主人名字
public void introduce() { // 自我介绍
System.out.println("我的名字是"+name+"!");
System.out.println("我的主人是"+masterName+"!");
}
}
子类
class RobotPet extends Pet{
public RobotPet(String name,String mastername) { //构造函数
super(name,mastername); // 超类构造函数
}
public void introduce() { //自我介绍
System.out.println("我是机器人。名字是"+getName()+"!");
System.out.println("我的主人是"+getMasterName()+"!");
}
public void work(int sw) {
switch (sw) {
case 0: System.out.println("打扫"); break;
case 1: System.out.println("洗衣服"); break;
case 2: System.out.println("做饭"); break;
}
}
}
main方法
public class day02 {
static void intro(Pet p) { //让p引用的实例进行自我介绍
p.introduce();
}
public static void main(String[] args) {
Pet [] a={ new Pet("kurt","艾一"),
new RobotPet("R2D2","卢克"),
new Pet("迈克尔","英男"),
};
for (Pet p:a) {
intro(p); //让p引用的实例进行自我介绍
System.out.println();
}
}
}
for循环另解
for(int i=0;i<a.length;i++) { intro(a[i]); System.out.println();
输出结果
方法intro的形参p是Pet类型,该方法只负责对p的启动方法introduce。当然,形参p除了接收Pet类类型的实例引用,还可以接收Pet类的下位类RobotPet类型的实例的引用。
main方法中创建了一个Pet类型的实例和RobotPet类型的实例混在一起的数组,并将这些实例的引用传递给了方法intro。
从运行结果可以确定,程序对于Pet类型的实例a[0]和a[2]调用了Pet类型的方法introduce,对RobotPet类型的实例a[1]则调用了RobotPet类型的方法introduce。