当前位置: 首页 > news >正文

JAVA接口和继承

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

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

源程序:

interface Buscard {
	void recharge();
	void charge();
}
class Oldpeople implements Buscard {
	public void recharge() {
		System.out.println("老年卡充值成功!");
	}
	public void charge() {
		System.out.println("使用老年卡,扣一元!");
	}
}
class People implements Buscard {
	public void recharge() {
		System.out.println("普通市民卡充值成功!");
	}
	public void charge() {
		System.out.println("使用普通市民卡,扣2元!");
	}
}
class Student implements Buscard {
	public void recharge() {
		System.out.println("学生卡充值成功!");
	}
	public void charge() {
		System.out.println("使用学生卡,扣1.5元!");
	}
}
public class test {
	public static void main(String[] args) {
		Oldpeople O = new Oldpeople();
		O.recharge();
		O.charge();
		Student S = new Student();
		S.recharge();
		S.charge();
		People P = new People();
		P.recharge();
		P.charge();
	}
}

2.设计四个类、一个接口,类之间的关系如下:

在类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对象)计算矩形面积。

源程序:

interface shape{
	double pi=3.14;
	double area();
}
class compute{
	public double computeArea(shape s) {
		return s.area();
	}
}
class circle implements shape{
	int radius;
	circle(int radius){
		this.radius=radius;
	}
	public double area() {
		return radius*radius*pi;
	}
}
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;
	}
}
public class test {

	public static void main(String[] args) {
	compute A=new compute();
	circle B=new circle(3);
	shape C=new Rectangle(6,4);
	System.out.println("矩形的面积为:"+C.area());
	System.out.println("圆的面积为:"+A.computeArea(B));
	System.out.println("圆的面积为:"+B.area());

	}
}

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

源程序:

interface Alarm {
	void alarm();
}
class Door {
	private String name;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void open() {
		System.out.println(this.name+"已打开");
	}
	public void close() {
		System.out.println(this.name+"已关闭");
	}
}
class AlarmDoor extends Door implements Alarm {
	public void alarm() {
		System.out.println("门发出警报声");
	}
}
public class test {
	public static void main(String[] args) {
		Door door1 = new Door();
		door1.setName("普通门");
		AlarmDoor door2 = new AlarmDoor();
		door2.setName("报警门");
		door1.open();
		door1.close();
		door2.open();
		door2.alarm();
		door2.close();
	}
}

4. 设计五个类(测试类、计算机类、手机类、充电器类、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盘器,正在读取数据...”。

源程序:

interface Usb {
	void connect();
}
class Charger implements Usb {
	private String brand;
	public Charger(String brand) {
		this.brand = brand;
	}
	public void connect() {
		System.out.println("已连接充电器" + this.brand + "正在充电...");
	}
}

class Computer {
	private String brand;
	public Computer(String brand) {
		this.brand = brand;
	}
	public void insertUsb(Usb device) {
		System.out.println(this.brand);
		device.connect();
	}
}
class Moblie {
	private String brand;
	public void Moblie(String brand) {
		this.brand = brand;
	}
	public void insertUsb(Usb device) {
		System.out.println(this.brand);
		device.connect();
	}
}
class UDisk implements Usb {
	private String brand;
	public UDisk(String brand) {
		this.brand = brand;
	}
	public void connect() {
		System.out.println("已连接U盘器" + this.brand + ",正在读取数据...");
	}
}
public class test {
	public static void main(String[] args) {
		Moblie a = new Moblie();
		a.Moblie("vivo");
		Charger b = new Charger("vivomx");
		Computer c = new Computer("联想");
		UDisk d = new UDisk("Kingston");
		a.insertUsb(b);
		c.insertUsb(d);
	}
}

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> weapon(用来存放军队装备的各种武器);
2) 获取军队的拥有的武器数量方法getNum;
3)添置武器的方法addWeapon
4) 让所有武器都装载弹药的方法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        发射导弹

源程序:

import java.util.ArrayList;
class Army {
	ArrayList<Weapon> weapon;
	public Army() {
		weapon = new ArrayList<Weapon>(); 
	}
	public int getNum() {
		return weapon.size();
	}
	public void addWeapon(Weapon weapon) {
		this.weapon.add(weapon); 
	}
	public void loadAll() {
		System.out.println("所有武器准备装弹药...");
		int a = 1;
		for (Weapon weapon : weapon) {
			System.out.print(a + ":" + weapon.getName());
			weapon.load();
			a++;
		}
	}
	public void luanchAll() {
		System.out.println("所有武器准备战斗...");
		int a = 1;
		for (Weapon weapon : weapon) {
			System.out.print(a + ":" + weapon.getName());
			weapon.launch();
			a++; 
		}
	}
}
class Bullet {
	private String name;
	public Bullet(String name) { 
		this.name = name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}
class Flighter extends Weapon { 
	public Flighter(String name) {
		setName(name);
		Bullet bullet = new Bullet("导弹");
		setBullet(bullet);
	}
}
interface Launchable {
	void launch();
}
interface Loadable {
	void load();
}
class Tank extends Weapon {
	public Tank(String name) {
		setName(name);
		Bullet bullet = new Bullet("炮弹");
		setBullet(bullet);
	}
}
class WarShip extends Weapon {
	public WarShip(String name) {
		setName(name);
		Bullet bullet = new Bullet("鱼雷");
		setBullet(bullet);
	}
}
class Weapon implements Loadable, Launchable {
	private String name;
	private Bullet bullet;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Bullet getBullet() {
		return bullet;
	}
	public void setBullet(Bullet bullet) {
		this.bullet = bullet;
	}
	public void load() {
		System.out.println("装载" + this.bullet.getName());
	}
	public void launch() {
		System.out.println("发射" + this.bullet.getName());
	}
}
public class test {
	public static void main(String[] args) {
		Tank a1 = new Tank("99坦克 ");
		Flighter a2 = new Flighter("歼20 ");
		WarShip a3 = new WarShip("武汉舰 ");
		WarShip a4 = new WarShip("芜湖舰 ");
		Flighter a5 = new Flighter("歼31 ");
		Flighter a6 = new Flighter("F35 ");
		Army a = new Army();
		a.addWeapon(a1);
		a.addWeapon(a2);
		a.addWeapon(a3);
		a.addWeapon(a4);
		a.addWeapon(a5);
		a.addWeapon(a6);
		System.out.println("军队装备的武器数量:" + a.getNum());
		a.loadAll();
		a.luanchAll();
	}
}

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.小兔子
======================
请选择:
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( )
输出可爱的小兔。


源程序:

import java.util.Scanner;
class test {
	public static void main(String[] args) {
		try (Scanner in = new Scanner(System.in)) {
		System.out.println("========作品列表=======");
		System.out.println("1.矩形");
		System.out.println("2.圆");
		System.out.println("3.小兔子");
		System.out.println("======================");
		System.out.println("请选择:");
		int select = in.nextInt();
		Paint paint = new Paint();
		switch (select) {
			case 1:
				Rectangle rect = new Rectangle("矩形", "张三", 3, 8);
				paint.setArt(rect);
				paint.draw();
				break;
			case 2:
				Circle c = new Circle("圆形", "小丫", 4);
				paint.setArt(c);
				paint.draw();
				break;
			case 3:
				Rabit rabit = new Rabit("兔子", "李四");
				paint.setArt(rabit);
				paint.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 getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
}
class Circle extends AssciiArt {
	private int radius;
	public Circle(String title, String author, int radius) {
		super(title, author);
		this.radius = radius;
	}
	public void draw() {
		int d = 2 * radius;
		for (int y = 0; y <= d; y++) {
			for (int x = 0; x <= d; x++) {
				if ((x - radius) * (x - radius) + (y - radius) * (y - radius) <= radius * radius)
					System.out.print("**");
				else
					System.out.print("  ");
			}
			System.out.println();
		}
	}
}
class Paint {
	private AssciiArt art;
	public void setArt(AssciiArt art) {
		this.art = art;
	}
	public void draw() {
		System.out.println("作品:" + this.art.getTitle());
		System.out.println("作者:" + this.art.getAuthor());
		this.art.draw();
	}
}
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 Rectangle extends AssciiArt {
	private int width;
	private int height;
	public Rectangle(String title, String author, int width, int height) {
		super(title, author);
		this.width = width;
		this.height = height;
	}
	public void draw() {
		for (int a = 0; a < width; a++) {
			for (int b = 0; b < height; b++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

相关文章:

  • AI-人工智能-多模态药物识别AI新算法GSFM,为精准药物表征装上“智慧眼”
  • 深入探索 `malloc`:内存分配失败的原因及正确使用规范
  • C语言:32位数据转换为floaf解析
  • RHCSA Linux 系统 文件的查看、复制、移动、重命名、编辑文件
  • GPT-5、o3和o4-mini即将到来
  • PCI认证 密钥注入 ECC算法工具 NID_secp521r1 国密算法 openssl 全套证书生成,从证书提取公私钥数组 x,y等
  • WinForm真入门(11)——ComboBox控件详解
  • 996引擎-源码学习:Cocos2d-Lua 的 class(classname, ...)
  • 2025 年河北交安安全员考试:巧用行业报告丰富知识储备​
  • 信息安全测评中心-国产化!
  • vi/vim常用快捷键
  • 【KWDB 创作者计划】架构设计与AIoT场景实践
  • micro介绍
  • 算法中Hash备胎——LRU的设计与实现
  • Spring Boot 配置文件加载优先级全解析
  • java方法04:命令行传递参数
  • Linux 内存映射机制:正向映射与反向映射深度解析
  • LeetCode零钱兑换(动态规划)
  • MYSQL数据库语法补充2
  • Rancher 全面介绍