一、实验目的
1.了解抽象类的概念、特征、作用
2.掌握抽象类的使用
3.掌握向上转型的用法
二、实验硬、软件环境
Windows计算机和Eclipse软件
三、实验内容及步骤
1. 升级电子宠物系统,将Pet定义为抽象类,并把print方法定义为抽象方法,再次实现宠物的领养和玩耍。
代码及运行结果如下:
父类:package 实验八;
public abstract class Pet {
public abstract void name();
public abstract void health();
public abstract void love();
public abstract void print(); }
子类:
宠物狗:package 实验八;
public class Dog extends Pet{
public void name() {
System.out.print("宠物的自我介绍:\n我的名字是:小小");}
public void health() {
System.out.print(" 健康值是:99");}
public void love() {
System.out.print(" 和主人的亲密度是:80");}
public void print() {
System.out.print(" 陪主人玩耍");}}
宠物企鹅:
package 实验八;
public class Penguin extends Pet{
public void name() {
System.out.print("宠物的自我介绍:\n我的名字是:泡芙"); }
public void health() {
System.out.print(" 健康值是:96"); }
public void love() {
System.out.print(" 和主人的亲密度是:85"); }
public void print() {
System.out.print(" 陪主人玩耍");}}
宠物金刚狼:
package 实验八;
public class Wolf extends Pet{
public void name() {
System.out.print("宠物的自我介绍:\n我的名字是:金刚"); }
public void health() {
System.out.print(" 健康值是:89");}
public void love() {
System.out.print(" 和主人的亲密度是:87");}
public void print() {
System.out.print(" 陪主人玩耍");}}
测试类:
package 实验八;
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
System.out.println("**************************");
System.out.println("宠物领养系统");
System.out.println("领养类型:\n1.宠物狗\n2.宠物企鹅\n3.宠物金刚狼");
System.out.println("**************************");
System.out.println("请选择:");
int n =sc.nextInt();
if(n==1) {
System.out.println("宠物狗");
Dog d = new Dog();
d.name();
d.health();
d.love();
d.print();
}else if(n==2){
System.out.println("宠物企鹅");
Penguin p = new Penguin();
p.name();
p.health();
p.love();
p.print();
}else if(n==3){
Wolf w = new Wolf();
w.name();
w.health();
w.love();
w.print();
}else if(n>3) {
System.out.println("输入领养类型错误,请重新输入");}}}
2.尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将它向上转型到基类并调用这个方法。
代码及运行结果如下:
父类:
package 实验八;
public class father {
public void name() {
System.out.print("大儿子");}
public void height() {
System.out.print(" 身高:");}}
子类:
package 实验八;
public class son extends father{
public void height() {
System.out.println(" 身高:190");}
测试类:
package 实验八;
public class test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
father a1 = new son();
a1.name();
a1.height();}}
3.尝试创建一个父类和子类,分别创建构造方法,然后向父类和子类添加成员变量和方法,并总结构建子类对象时的顺序。
父类:
package 实验八;
public class fu {
private String name;
private char sex;
private int age;
public fu() {
System.out.println();}
public fu(String name,char sex,int age) {
this.name = name;
this.sex = sex;
this.age = age;}
public String getName() {
return name;}
public void setName(String name) {
this.name = name;}
public char getSex() {
return sex;}
public void setSex(char sex) {
this.sex = sex;}
public int getAge() {
return age;}
public void setAge(int age) {
this.age = age;}
void show() {
System.out.print("相亲相爱一家人家庭成员介绍:
\n我的姓名为"+getName()+
", 性别为"+getSex()+
", 年龄为"+getAge());} }
子类:
package 实验八;
public class zi extends fu{
private String habby;
public zi() { }
public String getHabby() {
return habby;}
public void setHabby(String habby) {
this.habby = habby;}
void show() {
super.show();
System.out.println(", 爱好为"+getHabby());
System.out.println("构建子类对象时的顺序: \n父类静态成员"
+ "-->子类静态成员-->父类非静态成员"
+ "-->父类构造函数-->子类非静态成员\n-->子类构造函数");
} }
测试类:
package 实验八;
public class test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
zi z = new zi();
z.setName("大壮");
z.setSex('男');
z.setAge(21);
z.setHabby("跑步");
z.show();}}
四、实验结果及分析
1.第一个实验中需要把Pet定义为抽象类,其必须在类前用abstract关键字修饰,抽象类不能被实例化,不能用new关键字去产生对象;抽象类被子类继承,子类必须实现抽象方法;包含抽象方法的类肯定是抽象类,但抽象类中不一定包含抽象方法。
2.第二个实验中需将其子类向上转型到父类并调用子类中的方法,实验通过“father a1 = new son();”得以实现向上转型,此处父类对象可以是接口、抽象类或具体类。
3.构建子类对象时的顺序为父类静态成员、子类静态成员、父类非静态成员、父类构造函数、子类非静态成员、子类构造函数。