面向对象
目录
练习一:下载Eclipse Java EE版,并练习使用Eclipse编译器进行Java程序设计
设计结算接口SettleAccount,定义方法getAccount()
练习一:下载Eclipse Java EE版,并练习使用Eclipse编译器进行Java程序设计
下载Eclipse Java EE2018版成功后,新建项目新建类,使用Eclipse编译器进行Java程序设计。
练习二:类设计
货物类Item
货物类Item代码:
package mySecondJavaPractice;
public class Item {
// TODO Auto-generated method stub
private int id;//商品编号
private String name;//商品名称
private double price;//商品价格
private String description;//商品描述
//无参构造函数
Item()
{
}
Item(int id,String name,double price,String description)
{
this.id=id;//在构造方法中,this代表使用该构造方法创建的对象
this.name=name;
this.price=price;
this.description=description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;//在实例方法中,this代表正在调用该方法的当前对象
//其中,this不能出现在类方法中,类方法调用对象格式,类名.方法
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
//重写toString方法
public String toString()
{
return id + "\t " + name+"\t "+price+"\t "+description;
}
public static void main(String[] args) {
Item item1=new Item(1,"Benifit眉粉 ",228,"眉粉魔力宝盒套组");
Item item2=new Item(2,"Laura Mercier高光",265,"highlight-01");
Item item3=new Item(3,"空山新雨多功能刷 ",35,"多功能定妆GP02");
Item item4=new Item(4,"丝光唇釉 ",225,"152#暗紫色");
System.out.println("商品编号\t商品名称 \t价格 \t商品描述");
System.out.println(item1.toString());
System.out.println(item2.toString());
System.out.println(item3.toString());
System.out.println(item4.toString());
}
}
输出打印结果:
购物车项目类CartItem(即购物车的一行)
购物车项目类CartItem代码:
package mySecondJavaPractice;
import java.util.ArrayList;//使用ArrayList是明智之举
public class Cart {
private double totalPrice; //价格总计totalPrice
private ArrayList<CartItem> cartItem=new ArrayList<CartItem>(); //cartItem的存储
Cart()
{
totalPrice=0;
}
Cart(CartItem cartItem)//以一行CartItem存储加入并获取价格
{
this.cartItem.add(cartItem);
totalPrice=cartItem.getPrice();
}
Cart(ArrayList<CartItem> cartItem)//将若干行的CartItem存储加入并获取价格总计
{
totalPrice=0;
this.cartItem.addAll(cartItem);
for(int i=0;i<cartItem.size();i++)
{
totalPrice=totalPrice+cartItem.get(i).getPrice();
}
}
public ArrayList<CartItem> getCartItem()
{
return cartItem;
}
public void setCartItem(CartItem cartItem,int i)//修改某一购物车项目的购买数量
{
int t=this.cartItem.indexOf(cartItem);//由Java(一),indexOf得到位置
totalPrice=totalPrice-this.cartItem.get(t).getPrice();
this.cartItem.get(t).setQuantity(i);
totalPrice=totalPrice+this.cartItem.get(t).getPrice();//【注】当购物车中的购物车物品发生改变时,价格总计totalPrice应变化
}
public double gettotalPrice()
{
return totalPrice;
}
//增加一个购物车物品方法addCartItem()
public void addCartItem(CartItem cartItem)
{
this.cartItem.add(cartItem);
totalPrice=totalPrice+cartItem.getPrice();//【注】当购物车中的购物车物品发生改变时,价格总计totalPrice应变化
}
public void addCartItem(ArrayList<CartItem> cartItem)
{
this.cartItem.addAll(cartItem);
for(int i=0;i<=cartItem.size();i++)
{
totalPrice=totalPrice+cartItem.get(i).getPrice();//【注】当购物车中的购物车物品发生改变时,价格总计totalPrice应变化
}
}
//删除一个购物车物品方法deleteCartItem()
public void deleteCartItem(int i)
{
cartItem.remove(i);
totalPrice=totalPrice-cartItem.get(i).getPrice();//【注】当购物车中的购物车物品发生改变时,价格总计totalPrice应变化
}
public void deleteCartItem(CartItem cartItem)
{
this.cartItem.remove(cartItem);
totalPrice=totalPrice-cartItem.getPrice();//【注】当购物车中的购物车物品发生改变时,价格总计totalPrice应变化
}
public void deleteCartItem(ArrayList<CartItem> cartItem)
{
this.cartItem.removeAll(cartItem);
for(int i = 0;i<cartItem.size();i++) {
if(this.cartItem.remove(cartItem.get(i))) {
totalPrice=totalPrice-cartItem.get(i).getPrice();//【注】当购物车中的购物车物品发生改变时,价格总计totalPrice应变化
}
}
}
//清空购物车方法clearCartItem()
public void clearCartItem()
{
cartItem.clear();
totalPrice=0;//【注】当购物车中的购物车物品发生改变时,价格总计totalPrice应变化
}
public void PrinttoString()
{
System.out.println("商品编号\t商品名称 \t价格 \t商品描述 \t商品数量\t价格小计");
for(int i = 0;i<cartItem.size();i++)
{
System.out.println(cartItem.get(i).toString());
}
System.out.println("总计: "+gettotalPrice());
}
//面向对象抽象编程||面向接口编程
interface SettleAccount{//接口声明
public abstract int getAccount();//接口体,等价写法:int getAccount();
}
public abstract class Order{
public Cart c;//注意:一定要加上public,因为访问权限不能降低
Order(){
}
public Order(Cart c){
this.c=c;
}
public Cart getCart() {
return c;
}
public void setCart(Cart c) {
this.c = c;
}
//设计抽象方法printOrderInfo()用来输出购物车信息和结算金额。
public abstract void printOrderInfo();//接口中,只声明无具体实现
}
//普通顾客结算,结算金额为购物车价格总计,加配送费8元
public class NormalOrder extends Order{
NormalOrder(){
}
public NormalOrder(Cart c){
this.c=c;
}
public double getAccount() {
return gettotalPrice()+8;
}
public void printOrderInfo() {
System.out.println("普通顾客结算金额总计:"+getAccount());
}
}
//会员顾客结算,结算金额为购物车价格总计的9折,并无需配送费
public class VIPOrder extends Order{
VIPOrder(){
}
public VIPOrder(Cart c){
this.c=c;
}
public double getAccount() {
return gettotalPrice()*0.9;
}
public void printOrderInfo(){
System.out.println("VIP顾客结算金额总计:"+getAccount());
}
}
public static void main(String[] args)
{
Item item1=new Item(1,"Benifit眉粉 ",228,"眉粉魔力宝盒套组");
Item item2=new Item(2,"Laura Mercier高光",265,"highlight-01");
Item item3=new Item(3,"空山新雨多功能刷 ",35,"多功能定妆GP02");
Item item4=new Item(4,"丝光唇釉 ",225,"152#暗紫色");
CartItem CartItem1=new CartItem(item1,2);
CartItem CartItem2=new CartItem(item2,3);
CartItem CartItem3=new CartItem(item3,5);
CartItem CartItem4=new CartItem(item4,1);
ArrayList<CartItem> cartItem=new ArrayList<CartItem>();
cartItem.add(CartItem1);//2)对购物车添加若干购物车项目并打印购物车信息
cartItem.add(CartItem2);
cartItem.add(CartItem3);
cartItem.add(CartItem4);
Cart c=new Cart(cartItem);//1)定义购物车类Cart对象
/*System.out.println(" 对购物车添加4个购物车项目并打印购物车信息 ");
c.PrinttoString();
System.out.println("**********************************************");
System.out.println(" 修改商品编号为2购物车项目的购买数量为7并打印购物车信息 ");
c.setCartItem(CartItem2,7);//3)修改某一购物车项目的购买数量并打印购物车信息
c.PrinttoString();
System.out.println("**********************************************");
System.out.println(" 对购物车删除商品编号为3的购物车项目,并打印购物车信息 ");
c.deleteCartItem(2);//4)对购物车删除商品编号为3的购物车项目,并打印购物车信息
c.PrinttoString();
System.out.println("**********************************************");
c.clearCartItem();//5)清空购物车,并打印购物车信息
System.out.println(" 清空购物车,并打印购物车信息 ");
c.PrinttoString();
System.out.println("**********************************************");*/
/*NormalOrder normalOrder=c.new NormalOrder();
VIPOrder vIPOrder=c.new VIPOrder();
System.out.println(" 分别对购物车添加4个购物车物品,并打印订单信息 ");
cartItem.add(CartItem1);//9)分别对购物车添加4个购物车物品,并打印订单信息
cartItem.add(CartItem2);
cartItem.add(CartItem3);
cartItem.add(CartItem4);
c.PrinttoString();
normalOrder.printOrderInfo();
vIPOrder.printOrderInfo();
System.out.println("**********************************************");
System.out.println(" 分别修改商品编号为1购物车物品的数量为9,并打印订单信息 ");
c.setCartItem(CartItem1,9);//10)分别修改商品编号为1购物车物品的数量为9,并打印订单信息
c.PrinttoString();
normalOrder.printOrderInfo();
vIPOrder.printOrderInfo();
System.out.println("**********************************************");
System.out.println(" 分别对购物车删除商品编号为3购物车物品,并打印订单信息 ");
c.deleteCartItem(2);//11)分别对购物车删除若干购物车物品,并打印订单信息
c.PrinttoString();
normalOrder.printOrderInfo();
vIPOrder.printOrderInfo();
System.out.println("**********************************************"); */
}
}
1-5题代码将第一个/*···*/去掉运行
1-5题结果截图:
6-11题代码将第二个/*···*/注释去掉运行
6-11题结果截图:
练习三: 在主方法中实现下述功能
-
定义购物车类Cart对象
-
对购物车添加4个购物车项目并打印购物车信息
-
修改商品编号为2购物车项目的购买数量为7并打印购物车信息
-
对购物车删除商品编号为3的购物车项目,并打印购物车信息
-
清空购物车,并打印购物车信息
-
设计结算接口SettleAccount,定义方法getAccount()
-
设计订单类Order,类中拥有购物车Cart属性及其getter和setter方法以及无参构造方法和以Cart属性为参数的构造方法,设计抽象方法printOrderInfo()用来输出购物车信息和结算金额。
-
设计普通顾客订单类NormalOrder和会员顾客订单类VIPOrder,继承Order类,要求两个类都实现SettleAccount接口:普通顾客结算,结算金额为购物车价格总计,加配送费8元;会员顾客结算,结算金额为购物车价格总计的9折,并无需配送费。之后,实现根据普通顾客、会员实现不同的printOrderInfo打印效果。
-
分别对购物车添加若干购物车物品,并打印订单信息
-
分别修改某一购物车物品的数量,并打印订单信息
-
分别对购物车删除若干购物车物品,并打印订单信息
1-5题的结果截图:
6-11题 结果截图:
总结:
在完成实验二的过程中,按题目要求,将每个类设计,处理每个类的过程,遇到的一些问题,自行解决了。在写Cart类的过程耗时比较长,遇到很多问题,其中要把主办法的功能写进、加上接口和实现,值得一提的是,能抽象出整个CartItem存储、若干行CartItem一起存储,以及这一系列的增删改;在改的这一方法中使用了SetCartItem实现了对具体位置的商品数量进行更改;在这所有方法中价格总计都实现了伴随变化;在普通顾客和VIP顾客的实现中,使用了接口和实现,采用了类继承,最后定义对象时解决了内部类与外部类的联系。
通过这次实验,熟练掌握了如何设计一个类,以及抽象出类与类之间的关系和对象的存储、getter和setter方法、toString方法、设计接口、实现类继承等。