java实验指导书实验六--继承与多态(题目图片未发布)

此篇博客介绍了多个编程实例,包括公交车的老人卡、学生卡和普通市民卡的收费功能实现,计算圆和矩形面积的类与接口设计,报警门类及其接口,USB设备的连接操作,以及一个武器系统的设计,涵盖了接口、类的继承和实现等多个面向对象编程概念。
摘要由CSDN通过智能技术生成

实验内容

  1. 编写程序为公交车的老人卡、学生卡和普通市民卡提供收费功能。将充值、收费功能提取,定义在一个接口中,然后被这三种卡类实现。最后编写一个测试类,用于测试公交车三类卡的刷卡操作。
  2. 题目代码:
  3. package 实验六1;
  4. public interface Buscard {
  5. void recharge();
  6. void charge();
  7. }
  8. package 实验六1;
  9. public class Oldcard implements Buscard{
  10.    public void recharge() {
  11.       System.out.println("老年卡充值!");
  12.    }
  13.    public void charge() {
  14.       System.out.println("老年卡,扣除2!");
  15.    }
  16. }
  17. package 实验六1;
  18. public class OrdinaryCitizencard {
  19.    public void recharge() {
  20.       System.out.println("普通市民卡充值!");
  21.    }
  22.    public void charge() {
  23.       System.out.println("普通市民卡,扣除2!");
  24.    }
  25. }
  26. package 实验六1;
  27. public class studentcard implements Buscard {
  28.    public void recharge() {
  29.       System.out.println("学生卡充值!");
  30.    }
  31.    public void charge() {
  32.       System.out.println("学生卡!扣除2!");
  33.    }
  34. }
  35. package 实验六1;
  36. public class Test {
  37.    public static void main(String[] args) {
  38.       Oldcard Old = new Oldcard();
  39.       Old.charge();
  40.       Old.recharge();
  41.       studentcard Stu = new studentcard();
  42.       Stu.charge();
  43.       Stu.recharge();
  44.       OrdinaryCitizencard city = new OrdinaryCitizencard();
  45.       city.charge();
  46.       city.recharge();
  47.    }
  48. }
  49. 运行结果:
  50. 老年卡,扣除2!
  51. 老年卡充值!
  52. 学生卡!扣除2!
  53. 学生卡充值!
  54. 普通市民卡,扣除2!
  55. 普通市民卡充值!

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

题目代码:

package 实验六2;

public class App {

   public static void main(String[] args) {

      Compute a = new Compute();

      Circle b = new Circle(5);

      Rectangle c = new Rectangle(4, 5);

      System.out.println("圆的面积:"+a.computeArea(b));

      System.out.println("矩形的面积:"+a.computeArea(c));

   }

}

package 实验六2;

public class Circle implements Shape{

   private int radus;

   public Circle(int radus) {

      super();

      this.radus = radus;

   }

   public double area() {

      return PI*radus*radus;

   }

  

  

}

package 实验六2;

public class Compute{

   public double computeArea(Shape s) {

      return s.area();

   }

}

package 实验六2;

public class Rectangle implements Shape{

   private int width;

   private int height;

  

   public Rectangle(int width, int height) {

      super();

      this.width = width;

      this.height = height;

   }

   public double area() {

      return 1.0*width*height;

   }

  

}

package 实验六2;

public interface Shape {

   double PI = 3.14;

   double area();

}

运行结果:

圆的面积:78.5

矩形的面积:20.0

3. 普通门和报警门。

(1)定义一个接口Alarm(报警),含有一个报警方法void alarm( );

(2)定义一个类Door(普通门),Door类有一个私有属性name(品牌);有4个公有方法getName、setName、open(开门)、close(关门);open、close方法的功能由自己确定。

(3)定义一个类AlarmDoor(报警门),继承Door类,实现接口Alarm,重写接口中的抽象方法alarm(方法的功能由自己确定)。

(3)编写一个测试类DoorTest,在main方法中,给出多种型号的报警门和普通门,调用开门、关门、报警等动作。

题目代码:

package 实验六3;

public interface Alarm{

   void alarm();

}

package 实验六3;

public class AlarmDoor extends Door implements Alarm {

   public String getName() {

      return super.getName();

   }

   public void setName(String name) {

      super.setName(name);

   }

   public void open() {

      super.open();

   }

   public void close() {

      super.close();

   }

   public void alarm() {

      System.out.println(this.getName()+"警报响起~~~~");

   }

}

package 实验六3;

public 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+"关门了!");

}

}

package 实验六3;

public class DoorTest {

   public static void main(String[] args) {

      AlarmDoor A1=new AlarmDoor();

      A1.setName("高级报警门!");

      A1.open();

      A1.close();

      A1.alarm();

      AlarmDoor A2=new AlarmDoor();

      A2.setName("中级报警门!");

      A2.open();

      A2.close();

      A2.alarm();

      AlarmDoor A3=new AlarmDoor();

      A3.setName("低级报警门!");

      A3.open();

      A3.close();

      A3.alarm();

      AlarmDoor B=new AlarmDoor();

      B.setName("普通门!");

      B.open();

      B.close();

   }

}

运行结果:
高级报警门!开门了!

高级报警门!关门了!

高级报警门!警报响起~~~~

中级报警门!开门了!

中级报警门!关门了!

中级报警门!警报响起~~~~

低级报警门!开门了!

低级报警门!关门了!

低级报警门!警报响起~~~~

普通门!开门了!

普通门!关门了!

4.  设计五个类(测试类、计算机类、手机类、充电器类、U盘类)、一个接口(Usb接口),各类之间的关系如下:

(1)在UsbTest类的main方法中,创建一个Xiaomi手机对象、一个小米CDQ012M充电器对象、一台联想电脑、一个Kingston U盘对象。然后将充电器插入手机充电,将U盘插入计算机。

(2)在Mobile类的InsertUsb方法中,连接Usb。

(3)在Computer类的InsertUsb方法中,连接Usb。

(4)在Charger类的connect方法中,输出“已连接充电器,正在充电...”。

(5)在UDisk类的connect方法中,输出“已连接U盘器,正在读取数据...”。

题目代码:

package 实验六4;

public class Charger implements Usb {

   private String brand;

   public Charger(String brand) {

      super();

      this.brand=brand;

   }

   public void connect() {

      System.out.println("已连接充电器"+this.brand+",正在充电...");

   }

}

package 实验六4;

public class Computer {

   private String brand;

   public Computer(String brand) {

      super();

      this.brand=brand;

   }

   public void insertUsb(Usb device) {

      System.out.println(this.brand);

      device.connect();

   }

}

package 实验六4;

public class Mobile {

   private String brand;

   public Mobile(String brand) {

      super();

      this.brand=brand;

   }

   public void insertUsb(Usb device) {

      System.out.println(this.brand);

      device.connect();

   } 

}

package 实验六4;

public class UDisk implements Usb {

   private String brand;

   public UDisk(String brand) {

      super();

      this.brand=brand;

   }

   public void connect() {

      System.out.println("已连接U盘器"+this.brand+",正在读取数据...");

   }

   }

package 实验六4;

public interface Usb {

   void connect();

}

package 实验六4;

public class UsbTest {

   public static void main(String[] args) {

      // TODO Auto-generated method stub

      Mobile A=new Mobile("xiaomi");

      Charger B= new Charger("小米CDQ012M");

      Computer C=new Computer("联想");

      UDisk D=new UDisk("kingston");

      A.insertUsb(B);

      C.insertUsb(D);

   }

}

运行结果:

xiaomi

已连接充电器小米CDQ012M,正在充电...

联想

已连接U盘器kingston,正在读取数据...

5. 设计一个武器系统,要求如下:

(1)定义一个弹药类Bullet,有一个弹药名称属性name。设计一个构造方法及set、get方法。

(2)定义一个可装载弹药的接口Loadable,该接口有一个装载的抽象方法load()。

(3)定义一个可发射弹药的接口Launchable,该接口有一个发射的抽象方法launch()。

(4)定义一个武器类Weapon,既可以装弹,也可以发射。

    武器类有一个属性name(武器名称)、可使用的弹药bullet(Bullet对象)以及对应的get、set方法。

重写load方法,在方法中输出装载的弹药。

重写launch方法,在方法中输出发射的弹药。

(4)定义3个普通武器类:Tank、Flighter、WarShip都继承武器类Weapon。 每个普通武器类都有一个带一个参数name的构造方法,在构造方法中创建弹药对象。

坦克Tank使用的弹药是炮弹,战斗机Flighter使用的弹药是导弹,舰艇WarShip使用的弹药是鱼雷。

(5)定义一个类Army,代表一支军队,包括:。

1) 属性:ArrayList<Weapon> weapon用来存放军队装备的各种武器,自己查找集合类ArrayList的用法和泛型的知识点;

2) 获取军队的拥有的武器数量方法getNum;

3)添置武器的方法addWeapon

4) 让所有武器都装载弹药的方法loadAll;

5)让所有武器都发起攻击的方法luanchAll。

(6)编写一个测试类,在main方法中:

1)建立一支强大的军队;

2)添置各种型号武器,包括坦克、战机、舰艇。

3)输出军队拥有的武器数量;

4)让所有的武器都装上弹药;

5)让所有的武器都发射。

程序输出例:

军队装备的武器数量:6

所有武器准备装弹药...

1:99坦克   装载炮弹

2:歼20     装载导弹

3:武汉舰    装载鱼雷

4:芜湖舰    装载鱼雷

5:歼31     装载导弹

6:F35       装载导弹

所有武器准备战斗...

1:99坦克   发射炮弹

2:歼20     发射导弹

3:武汉舰    发射鱼雷

4:芜湖舰    发射鱼雷

5:歼31     发射导弹

6:F35       发射导弹

题目代码:

package 实验六5;

import java.util.ArrayList;

public class Army {

   ArrayList<Weapon> weapons = new ArrayList<Weapon>();

   public int getNum() {

      return weapons.size();

   }

   public void addWeapon(Weapon weapon) {

      weapons.add(weapon);

   }

   public void loadAll() {

      System.out.println("所有武器准备装弹药...");

      int i = 1;

      for (Weapon weapon : weapons) {

          System.out.print(i+":"+weapon.getName());

          weapon.load();

          i++;

      }

   }

   public void launchAll() {

      System.out.println("所有武器准备战斗...");

      int i = 1;

      for (Weapon weapon : weapons) {

          System.out.print(i+":"+weapon.getName());

          weapon.launch();

          i++;

      }

   }

}

package 实验六5;

public class Bullet {

   private String name;

   public Bullet(String name) {

      super();

      this.name=name;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

}

package 实验六5;

public class Flighter extends Weapon {

   public Flighter(String name) {

      setName(name);

      Bullet bullet=new Bullet("导弹");

      setBullet(bullet);

   }

}

package 实验六5;

public interface Launchable {

   void launch();

}

package 实验六5;

public interface Loadable {

   void load();

}

package 实验六5;

public class Tank extends Weapon {

   public Tank(String name) {

      setName(name);

      Bullet bullet = new Bullet("炮弹");

      setBullet(bullet);

   }

} package 实验六5;

public class Test {

   public static void main(String[] args) {

      // TODO Auto-generated method stub

      Tank T1 = new Tank("99坦克 ");

      Flighter F1 = new Flighter("20 ");

      Warship W1 = new Warship("武汉舰 ");

      Warship W2 = new Warship("芜湖舰 ");

      Flighter F2 = new Flighter("31 ");

      Flighter F3 = new Flighter("F35 ");

      Army A = new Army();

      A.addWeapon(T1);

      A.addWeapon(F1);

      A.addWeapon(W1);

      A.addWeapon(W2);

      A.addWeapon(F2);

      A.addWeapon(F3);

      System.out.println("军队装备的武器数量:"+A.getNum());

      A.loadAll();

      A.launchAll();

   }

   }

package 实验六5;

public class Warship extends Weapon{

   public Warship(String name) {

      setName(name);

      Bullet bullet=new Bullet("鱼雷");

      setBullet(bullet);

   }

}

package 实验六5;

public class Weapon implements Launchable,Loadable{

   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());

   }

}

   运行结果:

军队装备的武器数量:6

所有武器准备装弹药...

1:99坦克 装载炮弹

2:20 装载导弹

3:武汉舰 装载鱼雷

4:芜湖舰 装载鱼雷

5:31 装载导弹

6:F35 装载导弹

所有武器准备战斗...

1:99坦克 发射炮弹

2:20 发射导弹

3:武汉舰 发射鱼雷

4:芜湖舰 发射鱼雷

5:31 发射导弹

6:F35 发射导弹

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方法显示作品。

  1. Paint类中的draw( )

①显示作品名、作者。

②调用成员变量art的draw方法显示作品。

  1. Rectangle类中的draw( )

输出width行height列个“*”。

  1. Circle类中的draw( )

输出用“*”组成的圆。

  1. Rabit类中的draw( )

输出可爱的小兔。

   

例:

(1)对于main()中的程序:

Rectangle rect=new Rectangle("矩形","张三",3,8);

paint.setArt(rect);

paint.draw();

输出为:

作品:矩形

作者:张三

********

********

********

(2)对于main()中的程序:

Circle c = new Circle("圆形", "小丫", 4);

              p.setArt(c);

              p.draw();

//画圆的参考代码

void draw() {

              int d=2*r; //d:直径

              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) //(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 实验六6;

public class App {

   public static void main(String[] args) {

      Paint paint = new Paint();

      Rectangle rect = new Rectangle("矩形", "张三", 3, 8);

      paint.setArt(rect);

      paint.draw();

      Circle c = new Circle("圆形", "小丫", 4);

      paint.setArt(c);

      paint.draw();

      Rabit rabit = new Rabit("兔子","李四");

      paint.setArt(rabit);

      paint.draw();

   }

}

package 实验六6;

public abstract class AssciiArt {

   private String title;

   private String author;

   public AssciiArt(String title,String author) {

      super();

      this.title=title;

      this.author=author;

   }

   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;

   }

   abstract void draw();

}

package 实验六6;

public class Circle extends AssciiArt{

   private int radius;

   public Circle(String title, String author, int radius) {

      super(title, author);

      this.radius = radius;

   }

   void draw() {

      int d=2*radius; //d:直径

      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) //x,y)在园内

                System.out.print("**");

             else

                System.out.print("  ");

          }

          System.out.println();

      }

   }

}

package 实验六6;

public 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();

   }

  

  

} package 实验六6;

   public class Rabit extends AssciiArt{

      public Rabit(String title, String author) {

          super(title, author);

      }

      void draw() {

          System.out.println("可爱的小兔");

      }

     

   }

package 实验六6;

public class Rectangle extends AssciiArt{

   private int width;

   private int height;

  

   public Rectangle(String title, String author, int width, int height) {

      super(title, author);

      this.height = height;

      this.width = width;

   }

   void draw() {

      for(int i = 0;i<width;i++) {

          for(int j = 0;j<height;j++) {

             System.out.print("*");

          }

          System.out.println();

      }

   }

}

运行结果:

作品:矩形

作者:张三

********

********

********

作品:圆形

作者:小丫

        **       

    **********   

  ************** 

  ************** 

******************

  ************** 

  ************** 

    **********   

        **       

作品:兔子

作者:李四

可爱的小兔

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值