实验目的

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()中:

  1. 创建一个Compute类对象、一个Circle类对象和一个Rectangle类对象。
  2. 调用Compute对象的computeArea方法(实际参数为Circle对象)计算圆的面积。
  3. 调用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();

}

}

}