12. 面向对象基础

设计对象并使用

在Java中,必须先设计类才能获得对象。

类:是对象共同特征的描述(设计图)。

对象:是真实存在的具体实例。

定义类

12. 面向对象基础

12. 面向对象基础

得到类对象

12. 面向对象基础

对象内存图 

多个变量的内存图

12. 面向对象基础

对象放在堆内存中。

Car c = new Car(); 中c是存储的对象在堆内存中的地址。

成员变量的数据存放在对象中(堆内存)。

两个变量指向同一个对象的内存图

12. 面向对象基础

案例 购物车模块模拟 

12. 面向对象基础

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 +"添加购物车完成");
    }
}

构造器

构造器作用:用于初始化一个类的对象,并返回对象的地址。

12. 面向对象基础

 12. 面向对象基础

this关键字 

12. 面向对象基础

封装 

面向对象的三大特征:封装、继承、多态。

封装特点:合理隐藏,合理暴露

封装实现步骤 

12. 面向对象基础

标准JavaBean 

可以理解为实体类,其对象可以用于在程序中封装数据。

标准JavaBean满足的要求:

  • 成员变量使用private修饰
  • 提供每一个成员变量对应的set、get方法
  • 必须提供一个无参构造器

成员变量和局部变量的区别

12. 面向对象基础

 

上一篇:手动搭建高可用的Redis5-0分片集群,总结到位


下一篇:面向对象回顾(二)