实验任务
- 任务一:手机类的封装
- 任务二:基于控制台的购书系统
- 任务三:简单的投票程序
实验内容
任务一:手机类的封装
- 任务目的
- 理解和掌握面向对象的设计过程
- 掌握类的结构和定义过程
- 掌握构造方法及其重载
- 掌握对象的创建和使用
- 任务描述
参考程序结果图,使用面向对象的思想模拟手机类,编写测试类,使用手机类创建对象,测试手机的各个属性和功能
- 实施步骤
任务分析:
通过对现实中手机的分析,手机类(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();
}
}