文章目录
- 一、实验目的
- 二、实验内容及要求
- 三、实验内容及要求
- 1. 设计AnimalTool工具类,实现eat()函数多态性
- 💖 AnimalDemo.java
- 🌸 运行结果
- 2. 是猫是狗
- 💖 DuoTaiDemo5.java
- 🌸 运行结果
- 3. 太会了
- 💖 DuoTaiTest4.java
- 🌸 运行结果
- 4. 课程成绩等级
- 💖 PolymorphismTest.java
- 🌸 运行结果
- 5. 图形面积周长
- 💖 Main.java
- 🌸 运行结果
一、实验目的
1.掌握抽象类
2.掌握接口定义与实现方法。
3.掌握多接口。
4.掌握接口与抽象类的区别。
二、实验内容及要求
包含有抽象方法的类叫作抽象类 , 抽象类只定义它的所有子类共享的通用格式 , 至 于实现的细节 , 则由它的具体子类来完成。抽象类在声明时需要以 abstract 加以修饰。
abstract class 类名 {}
抽象方法也是用 abstract 加以修饰 , 抽象方法定义时在其方法头后面只有一个分号 , 而没有定义方法体。
abstract 返回类型 方法名 ( 参数表 ):
超类的抽象方法是由子类在继承的时候来实现的 , 当一个子类继承一个抽象类时 ,它必须实现超类中所有的抽象方法 , 否则这个子类也必须被标识为 abstract 类型。因为 在一个类中 , 只要有一个抽象方法存在 , 该类就必须声明为 abstract 类。
注意 : 抽象类是不能实例化的 , 如果用 new 去创建一个抽象类的对象 , 会产生编译错误。另外 , 包含抽象方法的类必须声明成抽象类 , 然而一个不包含任何抽象方法的类 , 也是可以声明成抽象类的。
三、实验内容及要求
1. 设计AnimalTool工具类,实现eat()函数多态性
💖 AnimalDemo.java
class Animal
{void eat(){System.out.println("动物吃饭");}
}class Cat extends Animal
{void eat(){System.out.println("猫猫吃鱼");}
}class Dog extends Animal
{void eat(){System.out.println("狗狗吃骨头");}
}class AnimalTool
{private AnimalTool(){}public static void feed(Animal a){a.eat();}
}public class AnimalDemo
{public static void main(String[] args){Animal c = new Cat();Animal d = new Dog();AnimalTool.feed(c);AnimalTool.feed(d);}
}
🌸 运行结果
2. 是猫是狗
💖 DuoTaiDemo5.java
class Animal
{public void eat(){}
}class Dog extends Animal
{public void eat(){}public void lookDoor(){}
}class Cat extends Animal
{public void eat(){}public void playGame(){}
}class DuoTaiDemo5
{public static void main(String[] args){// 内存中的是狗Animal a = new Dog();Dog d = (Dog) a;// 内存中是猫a = new Cat();Cat c = (Cat) a;// 内存中是猫Dog dd = (Dog) a;}
}
🌸 运行结果
尽管继承自相同的父类,两子类也不能随意做类型转换,猫不可能变成狗
3. 太会了
💖 DuoTaiTest4.java
class A
{public void show(){show2();}public void show2(){System.out.println("我");}
}class B extends A
{/*public void show() {show2();}*/public void show2(){System.out.println("爱");}
}class C extends B
{public void show(){super.show();}public void show2(){System.out.println("你");}
}public class DuoTaiTest4
{public static void main(String[] args){A a = new B();a.show();B b = new C();b.show();}
}
🌸 运行结果
爱
你
4. 课程成绩等级
设计 3 个类 , 分别是学生类 Student, 本科生类 Undergaduate, 研究生类 Postgraduate, 其中 Student 类是一个抽象类 , 它包含一些基本的学生信息如姓名、所学课程、课程成绩等 , 而 Undergraduate 类和 Postgraduate 都是 Student 类的子类 , 它们之间的主要差别是计算课程成绩等级的方法有所不同 , 研究生的标准要比本科生的标准高一些 , 如表 1 所示。
假设某班级里既有本科生也有研究生 , 请编写程序统计出全班学生的成绩等级并显示出来。此题关键是设计一个学生数组 , 既能存放本科生对象 , 又能存放研究生对象。
💖 PolymorphismTest.java
温馨提示:搜填空
即可找到修改的代码
//import java._____9____________; //填空
import java.util.*;//导java.util包下的所有类,不过这里并没有什么卵用abstract class Student
{final static int CourseNo = 3;private String name;private String type;private int[] courses;private String courseGrade;public Student(){}public Student(String name, String type){this.name = name;this.type = type;
// courses = new int[_____2_____]; //填空courses = new int[CourseNo];courseGrade = "";}public abstract void calculateGrade();public String getName(){return name;}public String getType(){return type; // 返回学生类型}public String getCourseGrade(){return courseGrade;}public int getCourseScore(int courseNumber){return courses[courseNumber];}public void setName(String name){this.name = name;}public void setType(String type){this.type = type;}public void setCourseScore(int courseNumber, int courseScore){
// ______4_______;//按课程索引号设置课程成绩 //填空courses[courseNumber] = courseScore;// 按课程索引号设置课程成绩}public void setCourseGrade(String courseGrade){this.courseGrade = courseGrade;}
}//class Postgraduate ______5_____ Student { //填空
class Postgraduate extends Student
{public Postgraduate(String name){
// ___6_______(name,"研究生"); //填空super(name, "研究生");}public void calculateGrade(){int total = 0;double average = 0;for (int i = 0; i < CourseNo; i++){total = total + getCourseScore(i);}average = total / CourseNo;String currentGrade = "";
// if (_____7________){ //填空if (average >= 90 && average <= 100){currentGrade = "优秀";} else if (average >= 80 && average < 90){currentGrade = "良好";} else if (average >= 70 && average < 80){currentGrade = "一般";} else if (average >= 60 && average < 70){currentGrade = "及格";} else{currentGrade = "不及格";}setCourseGrade(currentGrade);}
}class Undergraduate extends Student
{public Undergraduate(String name){
// super(name,_______8______);//填空super(name, "本科生");}public void calculateGrade(){int total = 0;double average = 0;for (int i = 0; i < CourseNo; i++){total = total + getCourseScore(i); // 累加各门课程成绩};average = total / CourseNo;String currentGrade = "";if (average >= 80 && average < 100){currentGrade = "优秀";} else if (average >= 70 && average < 80){currentGrade = "良好";} else if (average >= 60 && average < 70){currentGrade = "一般";} else if (average >= 50 && average < 60){currentGrade = "及格";} else{currentGrade = "不及格";}setCourseGrade(currentGrade);}
}public class PolymorphismTest
{public static void main(String[] args){// TODO Auto-generated method stub
// ____10______ studentArray = new Student[5];//填空
// ____11______ //本科生陈建平
// ____12______ //本科生鲁向东
// ____13______ //研究生匡晓华
// ____14______ //本科生周丽娜
// ____15______ //研究生梁欣欣Student[] studentArray = new Student[5];studentArray[0] = new Undergraduate("陈建平"); // 本科生陈建平studentArray[1] = new Undergraduate("鲁向东"); // 本科生鲁向东studentArray[2] = new Postgraduate("匡晓华"); // 研究生匡晓华studentArray[3] = new Undergraduate("周丽娜"); // 本科生周丽娜studentArray[4] = new Postgraduate("梁欣欣"); // 研究生梁欣欣for (int i = 0; i < studentArray.length; i++){studentArray[i].setCourseScore(0, 87);studentArray[i].setCourseScore(1, 90);studentArray[i].setCourseScore(2, 78);}for (int i = 0; i < 5; i++){studentArray[i].calculateGrade();}System.out.println("姓名" + " 类型" + " 成绩");System.out.println("-----------------------");for (int i = 0; i < 5; i++){System.out.println(studentArray[i].getName() + " " + studentArray[i].getType() + " "+ studentArray[i].getCourseGrade());}}
}
🌸 运行结果
5. 图形面积周长
💖 Main.java
类的命名可以小改一下
//定义一个抽象类Shapes,表示形状的基类
abstract class Shapes
{// 定义形状的公共属性:x和y坐标,宽度和高度public int x, y;public int width, height;// Shapes类的构造方法,初始化形状的位置和大小public Shapes(int x, int y, int width, int height){this.x = x;this.y = y;this.width = width;this.height = height;}// 定义一个抽象方法,计算形状的面积public abstract double getArea();// 定义另一个抽象方法,计算形状的周长public abstract double getPerimeter();
}//定义一个Circle类,继承自Shapes类,表示圆形
class Circle extends Shapes
{// 定义圆形的公共属性:半径public double radius;// Circle类的构造方法,初始化圆形的位置和大小public Circle(int x, int y, double radius){// 调用父类的构造方法,设置位置super(x, y, 0, 0);// 设置圆形的半径this.radius = radius;}// 实现抽象方法getArea,计算圆形的面积public double getArea(){return Math.PI * radius * radius;}// 实现抽象方法getPerimeter,计算圆形的周长public double getPerimeter(){return 2 * Math.PI * radius;}
}//定义一个Rectangle类,继承自Shapes类,表示矩形
class Rectangle extends Shapes
{// Rectangle类的构造方法,初始化矩形的位置和大小public Rectangle(int x, int y, int width, int height){// 调用父类的构造方法,设置位置和大小super(x, y, width, height);}// 实现抽象方法getArea,计算矩形的面积public double getArea(){return width * height;}// 实现抽象方法getPerimeter,计算矩形的周长public double getPerimeter(){return 2 * (width + height);}
}//定义一个Demo类,用于演示如何使用Shapes类
public class Main
{// Demo类的主方法,程序的入口点public static void main(String[] args){// 创建一个Rectangle对象,并调用其方法Shapes s1 = new Rectangle(2, 3, 4, 5);s1.getArea();s1.getPerimeter();// 打印矩形的面积和周长System.out.println("矩形面积:" + s1.getArea() + ",周长:" + s1.getPerimeter());// 创建一个Circle对象,并调用其方法Shapes s2 = new Circle(2, 2, 1);// 圆心:(2,2) 半径:1s2.getArea();s2.getPerimeter();// 打印圆形的面积和周长System.out.println("圆面积:" + s2.getArea() + ",周长:" + s2.getPerimeter());}
}