今天来到了Java核心的类和对象这里,如果这里都不会的话,那么Java基本就宣布走远吧。
今天印象最深的就是——设计UML。也因为这学期开设了这门课,老师也说了这门课就是区分我们软件工程和其它专业的最重要的一门课。上学期学java时也没太注意,今天对这个深有体会。在写代码之前,一个好的前期设计,能为代码带来顺畅的编写,不论是定义还是逻辑编写,类与类之间的关系等。
首先work_1是一个对于手机的类的创建和实例显示。
分析具有的属性,具有的功能,就再设计UML类图
类图最上面是类名,中间属性,下面是功能,有规定的表达方式。
然后就依据类图来编写代码
package Java的类和对象;
/*
* 到类这块了,也是面向对象的核心所在,所以这次要好好的分析
* 首先是会对一个类画UML类图,确实有了类图之后你在定义class的时候能逻辑更清晰,更流畅*/
public class work_1_Phone {
String brand;
String type;
String os;
int price;
int moneySize;
//无参构造方法
public work_1_Phone(){
}
//有参构造方法,进行属性初始化
public work_1_Phone(String newB,String newT,String newO,int newP,int newM){
this.brand=newB;
this.type=newT;
this.os=newO;
this.price=newP;
this.moneySize=newM;
}
//关于本机
public void about() {
System.out.println("品牌:"+brand+"\n型号:"+type+"\n操作系统:"+os+"\n价格:"+price+"\n内存:"+moneySize+"GB");
}
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;
default:phoneNo="空号。";
break;
}
System.out.println(phoneNo);
}
//玩游戏方法
public void playGame() {
System.out.println("猜数字游戏");
}
//下载音乐方法
public void downloadMusic(String song) {
System.out.println(song+"开始下载~");
System.out.println(song+"下载完毕");
}
//播放音乐方法
public void playMusic(String song) {
System.out.println(song+"开始播放");
}
}
这里都是很基础的构造方法,值得巩固基础。
最后进行实例测试
package Java的类和对象;
/*应用phone这个类来完成简单的操作*/
public class work_1_PhoneTest {
public static void main(String[] args) {
work_1_Phone ph=new work_1_Phone();
ph.brand="小米";
ph.type="小米4";
ph.price=1999;
ph.os="Android 4.0";
ph.moneySize=4;
ph.about();
ph.call(1);
ph.playGame();
ph.playMusic("晴天");
System.out.println("***************");
//使用含有参数的创建对象
work_1_Phone phx=new work_1_Phone("苹果", "iPhone4", "ios 8.1", 5999, 16);
phx.about();
phx.call(2);
phx.playGame();
phx.playMusic("一次就好");
}
}
主函数里面经典阐释了无参和有参的实例测试情况。
接下来的work_2是今天的重点。
让写一个基于控制台的购书系统,显示如下
图书列表
图书编号 图书名称
图书单价 库存数量
------------------------------
1 Java教程
30.6 30
2 JSP指南
42.1 40
3 SSH框架
47.3 15
------------------------------
请输入图书编号选择图书:
1
请输入购买图书的数量:
2
请继续购买图书。
请输入图书编号选择图书:
2
请输入购买图书的数量:
2
请继续购买图书。
请输入图书编号选择图书:
3
请输入购买图书的数量:
2
请继续购买图书。
图书订单
图书订单号:00001
图书名称 购买数量
图书单价
--------------------------
Java教程 2
30.6
JSP指南 2
42.1
SSH框架 2
47.3
--------------------------
订单总额: 240.0
算是最后的输出结果,当然程序还是基础,有很多可以改进的地方。
最主要的就是,这里会有三个实体类,所以
一开始分析设计出三个实体类,然后再出去对应的UML类图
每个类的功能确实也是一个能力,你需要分析出 这个类的功能到底有什么。
类与类之间的关系,是需要你有一个很好的分析能力和逻辑能力。
好像感觉熟知常识也是挺重要的。
UML图彻底搞明白后,编程真的对应着会很简单,三个类的定义如下
public class work_2_Book {
private int id;
private String name;
private double price;
private int storage;
//有参构造
public work_2_Book(int newI,String newN,double newP,int newS){
this.id=newI;
this.name=newN;
this.price=newP;
this.storage=newS;
}
public int getId(){
return id;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public int getStorage() {
return storage;
}
}
public class work_2_Order {
String orderId;
work_2_OrderItem items[];
double total;
public work_2_Order(String or){
this.orderId=or;
this.items=new work_2_OrderItem[3];
}
public String getOrderId() {
return orderId;
}
public work_2_OrderItem[] getItems(){
return items;
}
public double getTotal() {
calTotal();
return total;
}
public void setItem(work_2_OrderItem odt,int i) {
this.items[i]=odt;
}
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;
}
}
public class work_2_OrderItem {
work_2_Book book;
int num;
public work_2_OrderItem(work_2_Book book,int n){
this.book=book;
this.num=n;
}
public int getNum() {
return num;
}
public work_2_Book getBook(){
return book;
}
}
如此这样来定义类真的简便好多。
最后,类越多,在主函数里面执行时也是有些升级的设置。
这里,书上用到的是在main里面最好都是执行的函数,越清晰明了越好。函数功能再在下面完成即可
/*要明白自己定义的对象都表示的什么!!!*/
import java.util.Scanner;
public class work_2_MainBook {
public static void main(String[] args) {
work_2_Book books[]=new work_2_Book[3];
outBook(books);
work_2_Order order=purchase(books);
outOrder(order);
}
public static work_2_Order purchase(work_2_Book bo[]){
work_2_Order ord=new work_2_Order("00001");
work_2_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 cmany=in.nextInt();
item=new work_2_OrderItem(bo[cno-1], cmany);
ord.setItem(item, i);
System.out.println("请继续购买图书。");
}
return ord;
}
public static void outOrder(work_2_Order o) {
System.out.println("\n\t图书订单");
System.out.println("图书订单号:"+o.getOrderId());
System.out.println("图书名称\t\t购买数量\t图书单价");
System.out.println("--------------------------");
work_2_OrderItem ot[]=o.getItems();
for (int i=0;i<ot.length;i++)
System.out.println(ot[i].getBook().getName()+"\t"+ot[i].getNum()+"\t"+ot[i].getBook().getPrice());
System.out.println("--------------------------");
System.out.println("订单总额:\t\t"+o.getTotal());
}
public static void outBook(work_2_Book boo[]) {
boo[0]=new work_2_Book(1, "Java教程", 30.6, 30);
boo[1]=new work_2_Book(2, "JSP指南", 42.1, 40);
boo[2]=new work_2_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<boo.length;i++)
System.out.println(i+1+"\t"+boo[i].getName()+"\t"+boo[i].getPrice()+"\t"+boo[i].getStorage());
System.out.println("------------------------------");
}
}
最最最关键重要的地方,我个人觉得就是order和orderItem之间的关系,以及这俩里面属性到底是什么个意思。
orderItem可以找到book的属性
order里面有orderItem
这些关系都是从UML图里面很清晰明白的了解到的。
最后work_3是一个简单的投票程序
import java.util.HashSet;
import java.util.Set;
/*实现一个选民对某某的投票,同意或者不同意,一个人只能投票一次,显示投票的全部过程和结果*/
public class work_3_Voter {
private static final int max=100; //静态变量,最大投票时
private static int count=0; //静态变量,投票数
//静态变量,存放已经投票的选民
private static Set<work_3_Voter> voters=new HashSet<work_3_Voter>();
private String name;
private String note;
public work_3_Voter(String name){
this.name=name;
}
public void voterFor(String note) {
if (count==max){
System.out.println("投票结束");
return;
}
if (voters.contains(this))
System.out.println(name+":你不允许重复投票");
else{
this.note=note;
count++;
voters.add(this);
System.out.println(name+":感谢你投票");
}
}
public static void print(){
System.out.println("当前的投票数为:"+count);
System.out.println("参与投票的选民和结果如下");
for (work_3_Voter voter:voters)
System.out.println(voter.name+"意见:"+voter.note);
}
}
public class work_3_VoterTest {
public static void main(String[] args) {
work_3_Voter yellow=new work_3_Voter("小黄");
work_3_Voter black=new work_3_Voter("小黑");
work_3_Voter red=new work_3_Voter("小红");
yellow.voterFor("是");
yellow.voterFor("否");
black.voterFor("是");
red.voterFor("是");
work_3_Voter.print();
}
}
这里让慢慢了解集合的使用,HashSet!,很不错啊,需要集合里的是放入的对象不能重复的。
然后这里说让掌握static关键字的使用,他喵的这得查查啊。
静态常量静态变量都就用static,是该类的所有对象所共有,
就是这个属性是类的内部自己知道,不对外见,哦所以这里投票一直投下去,外面的人不知道到底投多少才算结束。
最后,附带网页版设计模式超实用网站https://www.processon.com/diagrams
和http://www.cnblogs.com/duanxz/archive/2012/06/13/2547801.html学习UML