实验目的
1. 掌握接口的使用方法。
2. 掌握子类的继承性、子类对象的创建过程。
3. 掌握成员变量的继承与隐藏、方法的继承与重写。
实验学时 6学时
实验内容
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元!");
}
}
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()中:
- 创建一个Compute类对象、一个Circle类对象和一个Rectangle类对象。
- 调用Compute对象的computeArea方法(实际参数为Circle对象)计算圆的面积。
- 调用Compute对象的computeArea方法(实际参数为Rectangle对象)计算矩形面积。
class App { public static void main(String[] args) { Compute a = new Compute(); Circle b = new Circle(2); Rectangle c = new Rectangle(2,2); System.out.println("圆的面积为:"+a.computArea(b)); System.out.println("矩形面积为:"+a.computArea(c)); } } class Circle implements Shape { private int radius; public Circle(int radius) { this.radius=radius; } public double area() { return PI*radius*radius; } } class Compute { public double computArea(Shape s) { return s.area(); } } class Rectangle implements Shape { private int width; private int height; public Rectangle(int width,int height) { this.width=width; this.height=height; } public double area() { return width*height; } } interface Shape { double PI=3.14; double 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 AlarmDoor extends Door implements Alarm { public void alarm() { System.out.println(this.getName()+"嘟嘟嘟!警报响起!"); } } 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 DoorTest { public static void main(String[] args) { AlarmDoor a1 = new AlarmDoor(); a1.setName("低级报警门!"); a1.open(); a1.alarm(); AlarmDoor a2 = new AlarmDoor(); a2.setName("高级报警门!!!"); a2.open(); a2.close(); a2.alarm(); AlarmDoor a3 = new AlarmDoor(); a3.setName("普通门."); a3.open(); a3.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盘器,正在读取数据...”。
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+",正在读取数据..."); } } interface Usb { void connect(); } class UsbTest { public static void main(String[] args) { Moblie a = new Moblie(); a.Moblie("Xiaomi"); Charger b = new Charger("小米CDQ012M"); 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)让所有的武器都发射。
import java.util.Scanner; class App { public static void main(String[] args) { 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(); } } }