GDPU Java 天码行空4 多态与抽象

本文介绍了Java中的抽象类、接口及其多态性应用,包括AnimalTool类的eat()函数实现、类型转换限制、多接口使用以及课程成绩等级的计算,通过实例展示了如何在实际项目中运用这些概念。
摘要由CSDN通过智能技术生成

一、实验目的

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());
	}
}

🌸 运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值