Java 实验案例(类和对象篇)

实验任务

  • 任务一:手机类的封装
  • 任务二:基于控制台的购书系统
  • 任务三:简单的投票程序

实验内容

任务一:手机类的封装

  • 任务目的
  1.  理解和掌握面向对象的设计过程
  2.  掌握类的结构和定义过程
  3.  掌握构造方法及其重载
  4.  掌握对象的创建和使用
  • 任务描述

    参考程序结果图,使用面向对象的思想模拟手机类,编写测试类,使用手机类创建对象,测试手机的各个属性和功能

     

  • 实施步骤

      任务分析:

    通过对现实中手机的分析,手机类(Phone)具有一下属性和功能

    (1) 具有属性:品牌(brand)、型号(type)、价格(price)、操作系统(os)和内存(memory)

    (2) 具有功能:查看手机信息(about())、打电话(call(String no))、玩游戏(比如玩猜数字游戏)

 

代码实现:

手机类Phone.java参考如下代码:

 

public class Phone {

    String brand;  // 品牌
    String type;   // 型号
    String os;     // 操作系统
    int price;    // 价格
    int memorySize;   // 内存
    
    // 无参构造
    public Phone(){
        
    }
    
    // 有参构造
    public Phone(String brand, String type, String os, int price, int memorySize) {
        this.brand = brand;
        this.type = type;
        this.os = os;
        this.price = price;
        this.memorySize = memorySize;
    }
    
    // 关于本机
    public void about() {
        System.out.println("品牌:"+brand+"\n"+"型号:"+type+"\n"+
                            "操作系统:"+os+"\n"+"价格:"+price+"\n"+"内存:"+memorySize+"\n");
    }
    
    // 打电话
    public void call(int num) {
        System.out.println("使用自动拨号功能:");
        String phoneNo = "";
        switch (num) {
        case 1: phoneNo = "爷爷的号。";break;
        case 2: phoneNo = "奶奶的号。";break;
        case 3: phoneNo = "妈妈的号。";break;
        case 4: phoneNo = "姐姐的号。";break;
        }
        System.out.println(phoneNo);
    }
    // 打游戏
    public void playGame() {
        System.out.println("玩猜字游戏。");
    }
    // 下载音乐
    public void downloadMusic(String song) {
        System.out.println("开始下载。。。。");
        System.out.println("下载完成。。。。");
    }
    // 播放音乐
    public void playMusic(String song) {
        System.out.println(song+" begin play");
    }
}

 

测试类PhoneTest.java类参考如下代码:

 

public class Test {
    public static void main(String[] args) {
        // 通过无参构造创建手机对象一
        Phone p1 = new Phone();
        p1.brand = "华为";
        p1.type = "华为荣耀magic";
        p1.os = "Android 7";
        p1.price = 3888;
        p1.memorySize = 8;
        // 测试p1的各项功能
        p1.about();
        p1.call(3);
        p1.playGame();
        p1.playMusic("好汉歌");
        System.out.println("********************");
        
        Phone p2 = new Phone("小米","小米6s","mi_9",4999,6);
        // 测试p2 的各项功能
        p2.about();
        p2.call(4);
        p2.playGame();
        p2.playMusic("Without you");
        
    }
}

 

任务二:基于控制台的购书系统

  • 任务目的
  1. 理解和掌握面向对象的设计程序
  2. 会用类图进行面向对象设计
  3. 掌握封装的实现及好处
  4. 包和访问控制修饰符的使用
  • 任务描述
  1. 输出所有图书的信息:包括每本书的编号、书名、单价、库存
  2. 顾客购买书:根据提示输入图书编号来购买书,并根据提示输入购买书的的数量
  3. 购买完毕后输出顾客的订单信息:包括订单号、订单明细、订单总额

   

  • 实施步骤

    任务分析:

      该系统中必须包括3个实体类,类名及属性设置如下:

      图书类(Book):

        图书编号(id)

        图书名称(name)

        图书单价(price)

        库存数量(storage)

      订单项类(OrderItem):

        图书(book)

        购买数量(num)

      订单类(Order):

        订单号(orderID)

        订单总额(total)

        订单项列表(items)

代码实现:

图书类

/**
 * 图书类
 * @author Administrator
 *
 */
public class Book {

    private int id;    // 编号
    private String name;  // 书名
    private double price;  // 价格
    private int storage;   // 库存
    
    // 有参构造
    public Book(int id, String name, double price, int storage) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.storage = storage;
    }
    // 获取书号
    public int getId() {
        return id;
    }
    // 获取书名
    public String getName() {
        return name;
    }
    // 获取价格
    public double getPrice() {
        return price;
    }
    // 获取库存
    public int getStorage() {
        return storage;
    }

}

订单项类:

 

public class OrderItem {

    private Book book;
    private int num;
    
    // 有参构造方法
    public OrderItem(Book book, int num) {
        this.book = book;
        this.num = num;
    }
    
    // 获取图书对象
    public Book getBook() {
        return book;
    }
    // 获取订购图书数量
    public int getNum() {
        return num;
    }
    
}

 

订单类:

 

public class Order {

    private String orderId;
    private OrderItem items[];
    private double total;
    
    // 有参构造
    public Order(String orderId) {
        this.orderId = orderId;
        this.items = new OrderItem[3];
    }
    
    // 获取订单号
    public String getOrderId() {
        return orderId;
    }
    // 获取订单列表
    public OrderItem[] getItems() {
        return items;
    }
    // 获取订单总额
    public double getTotal() {
        calTotal();
        return total;
    }
    // 指定一个订单项
    public void setItem(OrderItem item, int i) {
        this.items[i] = item;
    }
    // 计算订单总额
    public void calTotal() {
        double total = 0;
        for (int i = 0; i < items.length; i ++) {
            total += items[i].getNum() * items[i].getBook().getPrice();
        }
        this.total = total;
    }
}

 

主类参考代码如下:

 

import java.util.Scanner;

/**
 * 图书商店类(主类)
 * @author Administrator
 *
 */
public class PayBooks {
    public static void main(String[] args) {
        Book books[] = new Book[3];
        
        //模拟从数据库中读取图书信息并输出
        outBooks(books);
        // 顾客购买图书
        Order order = purchase(books);
        // 输出订单信息
        outOrder(order);
    }
    // 顾客购买图书
    public static Order purchase(Book books[]) {
        Order order = new Order("00001");
        OrderItem item = null;
        Scanner in = new Scanner(System.in);
        for (int i = 0; i < 3; i ++) {
            System.out.println("请输入图书编号选择图书:");
            int cno = in.nextInt();
            System.out.println("请输入购买图书数量:");
            int pnum = in.nextInt();
            item = new OrderItem(books[cno-1],pnum);
            order.setItem(item, i);
            System.out.println("请继续购买图书。");
        }
        in.close();
        return order;
    }
    
    // 输出订单信息
    public static void outOrder(Order order) {
        System.out.println("\n\t图书订单");
        System.out.println("图书订单号:"+order.getOrderId());
        System.out.println("图书名称\t购买数量\t图书单价");
        System.out.println("--------------------------------------");
        
        OrderItem items[] = order.getItems();
        for(int i = 0; i < items.length; i ++) {
            System.out.println(items[i].getBook().getName()+"\t"+items[i].getNum()
                            +"\t"+items[i].getBook().getPrice());
            //System.out.println("\n");
        }
        System.out.println("---------------------------------------");
        System.out.println("订单总额:\t\t"+order.getTotal());
    }
    
    // 模拟从数据库中读取图书信息并输出
    public static void outBooks(Book books[]) {
        books[0] = new Book(1,"Java教程",30.6,30);
        books[1] = new Book(2,"JSP教程",42.1,40);
        books[2] = new Book(3,"SSH架构",47.3,15);
        System.out.println("\t图书列表");
        System.out.println("图书编号\t图书名称\t\t图书单价\t库存数量");
        System.out.println("----------------------------------------");
        for (int i = 0; i < books.length; i ++) {
            System.out.println(i+1+"\t"+books[i].getName()+"\t"+
                        books[i].getPrice()+"\t"+books[i].getStorage());
        }
        System.out.println("----------------------------------------");
    }
    
}

 

任务三:简单投票系统

  • 任务目的
  1. 掌握static关键字的使用
  2. 区分实例变量和类变量、实例方法和类方法的区别
  • 任务描述

  编程实现一个投票程序,实现选民投票,每个选民只能投一次票,当投票总数达到100时或者

  主观结束投票时,同时统计投票选民和投票结果。程序运行结构如下:

  

  • 实施步骤

    任务分析

      从任务描述中的抽象出选民Voter类,它具有姓名,最大投票数,当前投票总数,和投票意见。

      因为所有选民都会改变同一个数据,即投票次数,一次把它定义成静态变量:

      private static int count;

      另外,为了防止选民重复投票,必须保存参与投票的选民信息,可采用一个集合来存放已经投票的选民对象。

      private static Set<Voter> voters = new HashSet<Voter>();

      最后编写测试Voter类的投票和打印投票结果功能。

代码实现:

 

import java.util.HashSet;
import java.util.Set;

public class Voter {

    // 属性的定义
    private static final int MAX_COUNT = 100;    // 最大投票数
    private static int count;                   // 投票数
    
    // 静态变量,存放已经投票的选民
    private static Set<Voter> voters = new HashSet<Voter>();
    private String name;
    private String answer;
    // 构造方法
    public Voter(String name) {
        this.name = name;
    }
    
    // 投票
    public void voterFor(String answer) {
        if (count == MAX_COUNT){
            System.out.println("投票结束。");
            return ;
        }
        if (voters.contains(this)){
            System.out.println(name+" 你不允许重复投票。");
        } else {
            this.answer = answer;
            count ++;
            voters.add(this);
            System.out.println(name+" 感谢你的投票。");
        }
    }
    
    // 打印投票结果
    public static void printVoterResult() {
        System.out.println("当前投票数为:"+count);
        System.out.println("参与投票的选民和结果如下:");
        
        for (Voter voter: voters) {
            System.out.println(voter.name+" 意见 "+voter.answer);
        }
    }
    
    public static void main(String[] args) {
        // 创建选民对象
        Voter tom = new Voter("Tom");
        Voter jack = new Voter("Jack");
        Voter mike = new Voter("Mike");
        
        // 选民开始投票
        tom.voterFor("");
        tom.voterFor("");
        jack.voterFor("");
        mike.voterFor("");
        
        // 打印投票结果
        Voter.printVoterResult();
    }
    
}

 

posted @ 2017-09-07 17:54  gaoyanliang  阅读(5702)  评论(0编辑  收藏  举报