Java 实验案例(类和对象篇)
实验任务
- 任务一:手机类的封装
- 任务二:基于控制台的购书系统
- 任务三:简单的投票程序
实验内容
任务一:手机类的封装
- 任务目的
- 理解和掌握面向对象的设计过程
- 掌握类的结构和定义过程
- 掌握构造方法及其重载
- 掌握对象的创建和使用
- 任务描述
参考程序结果图,使用面向对象的思想模拟手机类,编写测试类,使用手机类创建对象,测试手机的各个属性和功能
- 实施步骤
任务分析:
通过对现实中手机的分析,手机类(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"); } }
任务二:基于控制台的购书系统
- 任务目的
- 理解和掌握面向对象的设计程序
- 会用类图进行面向对象设计
- 掌握封装的实现及好处
- 包和访问控制修饰符的使用
- 任务描述
- 输出所有图书的信息:包括每本书的编号、书名、单价、库存
- 顾客购买书:根据提示输入图书编号来购买书,并根据提示输入购买书的的数量
- 购买完毕后输出顾客的订单信息:包括订单号、订单明细、订单总额
- 实施步骤
任务分析:
该系统中必须包括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("----------------------------------------"); } }
任务三:简单投票系统
- 任务目的
- 掌握static关键字的使用
- 区分实例变量和类变量、实例方法和类方法的区别
- 任务描述
编程实现一个投票程序,实现选民投票,每个选民只能投一次票,当投票总数达到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(); } }