实验六 接口和继承

实验目的

  1. 掌握接口的使用方法。
  2. 掌握子类的继承性、子类对象的创建过程。
  3. 掌握成员变量的继承与隐藏、方法的继承与重写。

实验学时

6学时

实验内容

  1. 编写程序为公交车的老人卡、学生卡和普通市民卡提供收费功能,将充值、收费功能提取,以接口的形式定义,然后被这三种卡类实现。最后编写一个测试类,用于测试公交车三类卡的刷卡操作。
    实验代码:
package test6;

public class exp1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Old a=new Old();
		a.kind();
		a.add(50);
		System.out.println("充值成功:"+a.balance+"元");
		a.pay(1);
		System.out.println("消费后余额:"+a.balance+"元");
		Student b=new Student();
		b.kind();
		b.add(100);
		System.out.println("充值成功:"+b.balance+"元");
		b.pay(1);
		System.out.println("消费后余额:"+b.balance+"元");
		Citizen c=new Citizen();
		c.kind();
		c.add(100);
		System.out.println("充值成功:"+c.balance+"元");
		c.pay(2);
		System.out.println("消费后余额:"+c.balance+"元");
	}

}
interface Card{
	abstract void kind();
	abstract void add(int x);
	abstract void pay(int y);
}
class Old implements Card{
	int balance=0;
	public void kind() {
		System.out.println("老年卡");
	}
	public void add(int x) {
		balance+=x;
	}
	public void pay(int y) {
		balance-=y;
	}
}
class Student implements Card{
	int balance=0;
	public void kind() {
		System.out.println("学生卡");
	}
	public void add(int x) {
		balance+=x;
	}
	public void pay(int y) {
		balance-=y;
	}
}
class Citizen implements Card{
	int balance=0;
	public void kind() {
		System.out.println("市民卡");
	}
	public void add(int x) {
		balance+=x;
	}
	public void pay(int y) {
		balance-=y;
	}
}

在这里插入图片描述
2.设计四个类、一个接口,类之间的关系如下:
在这里插入图片描述
UML类图符号说明:
在这里插入图片描述
在类App中使用Compute、Circle、Rectangle类,在Compute类中使用Shape接口(Shape对象作为computeArea方法的形式参数),Circle、Rectangle类实现接口Shape,重写area()方法。图中“+”的表示public,“-”的表示private,框图中上面一栏是类或接口的名称,中间一栏是属性,下面一栏是方法。
在App类的main()中:
(1)创建一个Compute类对象、一个Circle类对象和一个Rectangle类对象。
(2)调用Compute对象的computeArea方法(实际参数为Circle对象)计算圆的面积。
(3)调用Compute对象的computeArea方法(实际参数为Rectangle对象)计算矩形面积。
实验代码:

package test6;

public class App {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Compute a=new Compute();
		Circle b=new Circle(2);
		System.out.println("圆的面积:"+a.computeArea(b));
		Rectangle c=new Rectangle(2,3);
		System.out.println("矩形的面积:"+a.computeArea(c));
	}

}
interface Shape{
	final double PI=3.14;
	abstract double area();
}
class Circle implements Shape{
	int r;
	Circle(int r){
		this.r=r;
	}
	public double area(){
		return PI*r*r;
	}
}
class Rectangle implements Shape{
	int width;
	int hight;
	Rectangle(int width,int hight){
		this.width=width;
		this.hight=hight;
	}
	public double area(){
		return width*hight;
	}
}
class Compute{
	double computeArea(Shape s){
		return s.area();
	}
}

在这里插入图片描述

  1. 普通门和报警门。
    (1)定义一个接口Alarm(报警),含有一个报警方法void alarm( );
    (2)定义一个类Door(普通门),Door类有一个私有属性name(品牌);有4个公有方法getName、setName、open(开门)、close(关门);open、close方法的功能由自己确定。
    (3)定义一个类AlarmDoor(报警门),继承Door类,实现接口Alarm,重写接口中的抽象方法alarm(方法的功能由自己确定)。
    (4)编写一个测试类DoorTest,在main方法中,给出多种型号的报警门和普通门,调用开门、关门、报警等动作。
    实验代码:
package test6;

public class DoorTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Door a=new Door();
		a.setName("普通门");
		System.out.println(a.getName()+":");
		a.open();
		a.close();
		AlarmDoor b=new AlarmDoor();
		b.setName("低级报警门");
		System.out.println(b.getName()+":");
		b.open();
		b.alarm();
		b.setName("高级报警门");
		System.out.println(b.getName()+":");
		b.open();
		b.alarm();
		b.close();
	}

}
interface Alarm{
	void alarm();
}
class Door{
	private String name;
	public String getName(){
		return name;
	}
	public void setName(String n){
		name=n;
	}
	public void open(){
		System.out.println("门开了!");
	}
	public void close(){
		System.out.println("门关了!");
	}
}
class AlarmDoor extends Door implements Alarm{
	public void alarm(){
		System.out.println("嘟——警报!");
	}
}

在这里插入图片描述

  1. 设计五个类(测试类、计算机类、手机类、充电器类、U盘类)、一个接口(Usb接口),各类之间的关系如下:
    在这里插入图片描述
    (1)在UsbTest类的main方法中,创建一个Xiaomi手机对象、一个小米CDQ012M充电器对象、一台联想电脑、一个Kingston U盘对象。然后将充电器插入手机充电,将U盘插入计算机。
    (2)在Mobile类的InsertUsb方法中,连接Usb。
    (3)在Computer类的InsertUsb方法中,连接Usb。
    (4)在Charger类的connect方法中,输出“已连接充电器,正在充电…”。
    (5)在Usb类的connect方法中,输出“已连接U盘器,正在读取数据…”。
    实验代码:
package test6;

public class UsbTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Mobile x=new Mobile("Xiaomi手机");
		Charger a=new Charger("CDQ012M");
		Computer b=new Computer("联想电脑");
		UDisk c=new UDisk("KingstonU盘");
		System.out.println("联想电脑:");
		b.insertUsb(c);
		System.out.println("Xiaomi手机:");
		x.insertUsb(a);
	}

}
interface Usb{
	public void connect();
}
class Mobile{
	private String brand;
	public Mobile(String brand){
		this.brand=brand;
	}
	public void insertUsb(Usb device) {
		device.connect();
	}
}
class Computer{
	private String brand;
	public Computer(String brand){
		this.brand=brand;
	}
	public void insertUsb(Usb device) {
		device.connect();
	}
}
class Charger implements Usb{
	private String brand;
	public Charger(String brand){
		this.brand=brand;
	}
	public void connect() {
		System.out.println("已连接"+brand+"充电器,正在充电...");
	}
}
class UDisk implements Usb{
	private String brand;
	public UDisk(String brand){
		this.brand=brand;
	}
	public void connect() {
		System.out.println("已连接"+brand+",正在读取数据...");
	}
}

在这里插入图片描述
5. 设计一个武器系统,要求如下:
(1)定义一个弹药类Bullet,有一个弹药名称属性name。设计一个构造方法及set、get方法。
(2)定义一个可装载弹药的接口Loadable,该接口有一个装载的抽象方法load()。
(3)定义一个可发射弹药的接口Launchable,该接口有一个发射的抽象方法launch()。
(4)定义一个武器类Weapon,实现接口Loadable、Launchable(既可以装弹,也可以发射)。
武器类有属性:String name(武器名称)、Bullet bullet(可使用的弹药)
以及对应的get、set方法。
重写load方法,在方法中输出装载的弹药。
重写launch方法,在方法中输出发射的弹药。
(5)定义3个普通武器类:Tank、Flighter、WarShip都继承武器类Weapon。 每个普通武器类都有一个带一个参数name的构造方法,在构造方法中创建弹药对象。
坦克Tank使用的弹药是炮弹,战斗机Flighter使用的弹药是导弹,舰艇WarShip使用的弹药是鱼雷。
(6)定义一个类Army,代表一支军队,包括:。

  1. 属性:ArrayList weapon(用来存放军队装备的各种武器);
  2. 获取军队的拥有的武器数量方法getNum;
    3)添置武器的方法addWeapon
  3. 让所有武器都装载弹药的方法loadAll;
    5)让所有武器都发起攻击的方法luanchAll。
    (7)编写一个测试类,在main方法中:
    1)建立一支强大的军队;
    2)添置各种型号武器,包括坦克、战机、舰艇。
    3)输出军队拥有的武器数量;
    4)让所有的武器都装上弹药;
    5)让所有武器都发射
    在这里插入图片描述
    UML类图符号说明
    在这里插入图片描述
    程序输出例:
    军队装备的武器数量:6

所有武器准备装弹药…
1:99坦克 装载炮弹
2:歼20 装载导弹
3:武汉舰 装载鱼雷
4:芜湖舰 装载鱼雷
5:歼31 装载导弹
6:F35 装载导弹

所有武器准备战斗…
1:99坦克 发射炮弹
2:歼20 发射导弹
3:武汉舰 发射鱼雷
4:芜湖舰 发射鱼雷
5:歼31 发射导弹
6:F35 发射导弹
实验代码:

package test6;
import java.util.ArrayList;
public class WeaponTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("建立一支强大的军队:");
		Army q=new Army();
		Weapon p=new Weapon();
		System.out.println("军队装备武器数量:"+q.getNum());
		q.loadAll();
		Bullet n1=new Bullet("炮弹");
		Bullet n2=new Bullet("导弹");
		Bullet n3=new Bullet("鱼雷");
		System.out.print("1:99坦克"+"\t");
		p.load(n1);
		System.out.print("2:歼20"+"\t");
		p.load(n2);
		System.out.print("3:F35"+"\t");
		p.load(n2);
		System.out.print("4:武汉舰"+"\t");
		p.load(n3);
		System.out.print("5:芜湖舰"+"\t");
		p.load(n3);
		q.launchAll();
		System.out.print("1:99坦克"+"\t");
		p.launch(n1);
		System.out.print("2:歼20"+"\t");
		p.launch(n2);
		System.out.print("3:F35"+"\t");
		p.launch(n2);
		System.out.print("4:武汉舰"+"\t");
		p.launch(n3);
		System.out.print("5:芜湖舰"+"\t");
		p.launch(n3);
	}

}
class Bullet{
	private String name;
	public Bullet(String name){
		this.name=name;
	}
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
}
interface Loadable{
	public void load(Bullet bullet);
}
interface Launchable{
	public void launch(Bullet bullet);
}
class Weapon implements Loadable,Launchable{
	private String name;
	private String bullet;
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	public void load(Bullet bullet){
		System.out.println("装载"+bullet.getName());
	}
	public void launch(Bullet bullet){
		System.out.println("发射"+bullet.getName());
	}
}
class Tank extends Weapon{
	public Tank(String name){
		Bullet n1=new Bullet("炮弹");
	}
}
class Flighter extends Weapon{
	public Flighter(String name){
		Bullet n2=new Bullet("导弹");
	}
}
class Warship extends Weapon{
	public Warship(String name){
		Bullet n3=new Bullet("鱼雷");
	}
}
class Army{
	String name;
	private ArrayList<Weapon>weapon;
	Army(){
	}
	public int getNum(){
		return 5; 
	}
	public void addWeapon(Weapon weapon) {
		System.out.println("添加武器:"+weapon.getName());
	}
	public void loadAll(){
		System.out.println("所有武器准备装弹药...");
	}
	public void launchAll() {
		System.out.println("所有武器准备战斗...");
	}
}

在这里插入图片描述
6. 设计五个类,类之间的关系如下:
在类App中使用Paint、Rectangle、Circle、Rabit类,在paint类中使用AsciiArt抽象类(AsciiArt对象作为setArt方法的参数),Rectangle、Circle、Rabit类继承抽象类AsciiArt,并重写draw()方法。
具体设计步骤:
(1)App类的main( )
1)创建一个Paint对象paint
2)显示作品列表
==作品列表=

  1. 矩形
  2. 小兔子
    ======================
    请选择:
    3) 根据选择,显示不同的作品
    ① 画矩形
    a.创建一个Rectangle对象rect。
    b.调用paint的setArt方法,将rect设置为paint对象要显示的作品。
    c.调用对象paint的draw方法显示作品。
    ②画圆
    a.创建一个Circle对象c。
    b.调用paint的setArt方法,将c设置为paint对象要显示的作品。
    c.调用对象paint的draw方法显示作品。
    ③画小兔子
    a.创建一个Rabit对象rabit。
    b.调用paint的setArt方法,将rabit设置为paint对象要显示的作品。
    c.调用对象paint的draw方法显示作品。
    (2)Paint类中的draw( )
    ①显示作品名、作者。
    ②调用成员变量art的draw方法显示作品。
    (3)Rectangle类中的draw( )
    输出width行height列个“”。
    (4)Circle类中的draw( )
    输出用“
    ”组成的圆。
    (5)Rabit类中的draw( )
    输出可爱的小兔。
    在这里插入图片描述
    例:
    (1)对于main()中的程序:
    Rectangle rect=new Rectangle(“矩形”,“张三”,3,8);
    paint.setArt(rect);
    paint.draw();

输出为:
作品:矩形
作者:张三




(2)对于main()中的程序:
Circle c = new Circle(“圆形”, “小丫”, 4);
p.setArt©;
p.draw();
//画圆的参考代码
void draw() {
int d=2r; //d:直径
for(int y=0;y<=d;y++){
for(int x=0;x<=d;x++){
if((x-r)
(x-r)+(y-r)(y-r)<=rr) //(x,y)在园内
System.out.print(“**”);
else
System.out.print(" ");
}
System.out.println();
}
}
(3)对于main()中的程序
Rabit rabit=new Rabit(“兔子”,“李四”);
Paint.setArt(rabit);
paint.draw();

输出为:
作品:矩形
作者:张三
/ ) / )
(- -) ) o
| | | |
实验代码:

package test6;
import java.util.Scanner;
public class AppTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Paint p=new Paint();
		System.out.println("======作品列表======"+"\n"+"1.矩形"+"\n"+"2.圆"+"\n"+"3.小兔子");
		System.out.println("=================="+"\n"+"请选择:");
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		switch(n) {
		case 1:
		Rctangle rect=new Rctangle("矩形","张三",3,8);
		p.setArt(rect);
		p.draw();
		rect.draw();
		break;
		case 2:
		Circle c=new Circle("圆形","小丫",4);
		p.setArt(c);
		p.draw();
		c.draw();
		break;
		case 3:
		Rabit r=new Rabit("兔子","李四");
		p.setArt(r);
		p.draw();
		r.draw();
		break;
		}
	}

}
abstract class AssciiArt{
	private String title;
	private String author;
	public AssciiArt(String title,String author){	
		this.title=title;
		this.author=author;
	}
	abstract void draw();
	public String getTile() {
		return title;
	}
	public void setTilte(String title) {
		this.title=title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author=author;
	}
}
class Paint{
	private AssciiArt art;
	public void setArt(AssciiArt art){
		this.art=art;
	}
	public void draw() {
		System.out.println("作品:"+this.art.getTile()+"\n"+"作者:"+this.art.getAuthor());
	}
}
class Rctangle extends AssciiArt{
	private int width;
	private int height;
	public Rctangle(String title,String author,int width,int height){
		super(title,author);
		this.width=width;
		this.height=height;
	}
	public void draw() {
		for(int i=0;i<width;i++) {
			for(int j=0;j<height;j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}
class Rabit extends AssciiArt{
	public Rabit(String title,String author){
		super(title,author);
	}
	public void draw() {
		System.out.println("/)/)");
		System.out.println("(- -)  )o");
		System.out.println("  ||  ||");
	}
}
class Circle extends AssciiArt{
	private int r;
	public Circle(String title,String author,int r){
		super(title,author);
		this.r=r;
	}
	public void draw() {
		int d=2*r;
		for(int y=0;y<=d;y++) {
			for(int x=0;x<=d;x++) {
				if((x-r)*(x-r)+(y-r)*(y-r)<=r*r)
					System.out.print("**");
				else System.out.print("  ");
			}
			System.out.println();
		}
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java继承接口、多态是面向对象编程的三大核心特性,以下是它们的实验总结: 1. 继承继承是一种重用代码的方式,它允许我们定义一个新的类,该类继承了现有类的属性和方法。在Java中,继承是通过关键字"extends"来实现的。 在实验过程中,我们可以通过定义一个父类,然后在子类中使用"extends"关键字继承父类的属性和方法。例如: ```java class Animal { public void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { public void bark() { System.out.println("Dog is barking"); } } ``` 在上面的例子中,Dog类继承了Animal类的eat()方法。我们可以实例化Dog类并调用eat()方法,因为Dog类继承了Animal类的行为。 2. 接口接口是一种定义行为的方式,它定义了类应该如何相互协作。在Java中,接口是通过关键字"interface"来定义的。 在实验过程中,我们可以通过定义一个接口来定义类的行为,然后让类实现该接口。例如: ```java interface Animal { public void eat(); } class Dog implements Animal { public void eat() { System.out.println("Dog is eating"); } } ``` 在上面的例子中,Animal接口定义了eat()方法,然后Dog类实现了该接口并实现了eat()方法。 3. 多态:多态是一种对象的行为表现方式,它允许我们使用一个父类的引用来引用一个子类的对象。在Java中,多态是通过继承接口来实现的。 在实验过程中,我们可以定义一个父类的引用,并使用该引用来引用一个子类的对象。例如: ```java class Animal { public void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { public void eat() { System.out.println("Dog is eating"); } } public class Main { public static void main(String[] args) { Animal a = new Animal(); Animal b = new Dog(); a.eat(); // 输出 "Animal is eating" b.eat(); // 输出 "Dog is eating" } } ``` 在上面的例子中,我们定义了一个Animal类和一个Dog类,然后在main()方法中定义了一个Animal类型的引用a和一个Animal类型的引用b,并使用它们来引用一个Animal对象和一个Dog对象。由于Dog类继承了Animal类的eat()方法,并且重写了该方法,因此在调用b.eat()方法时,输出的是"Dog is eating"。这就是多态的表现方式。 总的来说,继承接口、多态是Java面向对象编程的三大核心特性,它们可以帮助我们更好地组织代码、提高代码的可重用性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值