设计对象并使用
在Java中,必须先设计类才能获得对象。
类:是对象共同特征的描述(设计图)。
对象:是真实存在的具体实例。
定义类
得到类对象
对象内存图
多个变量的内存图
对象放在堆内存中。
Car c = new Car(); 中c是存储的对象在堆内存中的地址。
成员变量的数据存放在对象中(堆内存)。
两个变量指向同一个对象的内存图
案例 购物车模块模拟
Goods.java
public class Goods {
int id; //编号
String name; //名称
double price; //价格
int buyNumber; //购买数量
}
ShopCarTest.java
package com.text.test;
import java.util.Scanner;
public class ShopCarTest {
public static void main(String[] args) {
//1. 定义商品类,用于后期创建商品对象
//2. 定义购物车对象,使用一个数组对象表示
Goods[] shopCar = new Goods[100]; //[null,null,...]
while (true) {
//建操作架构
System.out.println("选择如下命令进行操作:");
System.out.println("添加商品到购物车:add");
System.out.println("查询购物车商品展示:query");
System.out.println("修改商品数量:update");
System.out.println("购买商品金额:pay");
Scanner sc = new Scanner(System.in);
System.out.println("请输入命令: ");
String command = sc.next();
switch (command) {
case "add":
//添加商品到购物车
addGoods(shopCar, sc);
break;
case "query":
//查询购物车商品展示
queryGoods(shopCar);
break;
case "update":
//修改商品数量
updateGoods(shopCar,sc);
break;
case "pay":
//购买商品金额
pay(shopCar);
break;
default:
System.out.println("没有该功能,请重新输入");
}
}
}
/*输出购买商品金额*/
public static void pay(Goods[] shopCar) {
double sum = 0;
for (int i = 0; i < shopCar.length; i++) {
Goods g = shopCar[i];
if (shopCar[i] != null){
sum += g.price * g.buyNumber;
}
else {
break;
}
}
queryGoods(shopCar);
System.out.println("本次购买商品的总金额为" + sum);
}
/*修改商品数量*/
public static void updateGoods(Goods[] shopCar, Scanner sc) {
while (true) {
System.out.println("输入商品id");
int id = sc.nextInt();
Goods g = getGoodsByID(shopCar, id);
if (g == null) {
//没有商品
System.out.println("没有购买该商品");
} else {
//存在该商品
System.out.println("输入" + g.name + "的商品数量");
int buyNumber = sc.nextInt();
g.buyNumber = buyNumber;
System.out.println("修改完成");
queryGoods(shopCar);
break;
}
}
}
public static Goods getGoodsByID(Goods[] shopCar, int id){
for (int i = 0; i < shopCar.length; i++) {
Goods g = shopCar[i];
if(g != null){
if(g.id == id){
return g;
}
}else {
return null;//找完了全面存在的商品,都没有找到
}
}
return null;
}
/*查询购物车中的商品信息,并展示出来*/
public static void queryGoods(Goods[] shopCar) {
System.out.println("=========查询购物车信息如下=========");
System.out.println("编号\t\t名称\t\t\t价格\t\t\t购买数量");
for (int i = 0; i < shopCar.length; i++) {
Goods g = shopCar[i];
if (g != null){
//展示商品对象
System.out.println(g.id + "\t\t" + g.name + "\t\t\t" + g.price + "\t\t\t" + g.buyNumber);
}else {
//遍历结束
break;
}
}
}
/*完成商品添加到购物车功能*/
public static void addGoods(Goods[] shopCar, Scanner sc) {
//1. 录入用户输入的购买商品的信息
System.out.println("输入商品编号(不重复):");
int id = sc.nextInt();
System.out.println("输入商品名称:");
String name = sc.next();
System.out.println("输入购买商品的数量:");
int buyNumber = sc.nextInt();
System.out.println("输入购买商品的价格:");
double price = sc.nextDouble();
//2. 将购买商品的信息封装成一个商品对象
Goods g = new Goods();
g.buyNumber = buyNumber;
g.id = id;
g.name = name;
g.price = price;
//3. 把商品对象添加到购物车数组中去
for (int i = 0; i < shopCar.length; i++) {
if(shopCar[i] == null){
//此位置没有元素存入
shopCar[i] = g;
break; //成功存入
}
}
System.out.println("商品" + g.name +"添加购物车完成");
}
}
构造器
构造器作用:用于初始化一个类的对象,并返回对象的地址。
this关键字
封装
面向对象的三大特征:封装、继承、多态。
封装特点:合理隐藏,合理暴露
封装实现步骤
标准JavaBean
可以理解为实体类,其对象可以用于在程序中封装数据。
标准JavaBean满足的要求:
- 成员变量使用private修饰
- 提供每一个成员变量对应的set、get方法
- 必须提供一个无参构造器
成员变量和局部变量的区别