实验目的
- 掌握接口的使用方法。
- 掌握子类的继承性、子类对象的创建过程。
- 掌握成员变量的继承与隐藏、方法的继承与重写。
实验学时
6学时
实验内容
- 编写程序为公交车的老人卡、学生卡和普通市民卡提供收费功能,将充值、收费功能提取,以接口的形式定义,然后被这三种卡类实现。最后编写一个测试类,用于测试公交车三类卡的刷卡操作。
实验代码:
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)定义一个接口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("嘟——警报!");
}
}
- 设计五个类(测试类、计算机类、手机类、充电器类、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,代表一支军队,包括:。
- 属性:ArrayList weapon(用来存放军队装备的各种武器);
- 获取军队的拥有的武器数量方法getNum;
3)添置武器的方法addWeapon - 让所有武器都装载弹药的方法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)显示作品列表
==作品列表=
- 矩形
- 圆
- 小兔子
======================
请选择:
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();
}
}
}