文章目录
一、实验目的
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. 图形面积周长
💖 ShapeDemo.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 ShapeDemo
{
// 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) 半径:1
s2.getArea();
s2.getPerimeter();
// 打印圆形的面积和周长
System.out.println("圆面积:" + s2.getArea() + ",周长:" + s2.getPerimeter());
}
}