Java面向对象内存图、垃圾回收

构造器

public class Car {
    String name;
    double price;

    /**
      无参数构造器(默认存在的)
     */
    public Car(){
        System.out.println("无参数构造器被触发执行~~~");
    }

    /**
       有参数构造器
     */
    public Car(String n, double p){
        System.out.println("有参数构造器被触发执行~~~");
        name = n;
        price = p;
    }
}

this指向

public class Car {
    String name;
    double price;

    public void goWith(String name){
        System.out.println(this.name +"正在和:" + name +"比赛!");
    }

    /**
      无参数构造器(默认存在的)
     */
    public Car(){
        System.out.println("无参数构造器被触发执行~~~");
    }

    /**
       有参数构造器
     */
    public Car(String name, double price){
        System.out.println("有参数构造器被触发执行~~~");
        System.out.println(this);
        this.name = name;
        this.price = price;
    }
}

面向对象基础:JavaBean
可以定义完成员变量右键Generate Get Set 自动生成函数

public class User {
    private double height;
    private String name;
    private double salary;
    private String address;
    private String phone;

    public User() {
    }

    public User(double height, String name, double salary, String address, String phone) {
        this.height = height;
        this.name = name;
        this.salary = salary;
        this.address = address;
        this.phone = phone;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

购物车练习
定义类 Goods.java

package com.domain.demo;

public class Goods {
    // javabean要全部私有
    private int id;
    private String name;
    private double price;
    private int buyNumber;

    public Goods(){

    }

    // IDE右键Generate Constructor 一般有参数的构造器不常用
    public Goods(int id, String name, double price, int buyNumber) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.buyNumber = buyNumber;
    }

    // IDE右键Generate Getter Setter 自动生成
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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 int getBuyNumber() {
        return buyNumber;
    }

    public void setBuyNumber(int buyNumber) {
        this.buyNumber = buyNumber;
    }
}

ShopCarTest.java

package com.domain.demo;

import java.util.Scanner;

public class ShopCarTest {
    public static void main(String[] args) {
        Goods[] shopCar = new Goods[100]; // [null, null, ...]

        // 选中代码 Ctrl + Alt + T 可以加 while
        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":
                    // 添加到购物车
                    // Alt + 回车 自动创建方法
                    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) {
        queryGoods(shopCar);

        double money = 0;
        // [g1, g2, null, ...]
        for (int i = 0; i < shopCar.length; i++) {
            Goods g = shopCar[i];
            if(g != null) {
                money += g.getPrice() * g.getBuyNumber();
            } else {
                break;
            }
        }

        System.out.println("订单总金额:"+ money);
    }

    public static Goods getGoodsById(Goods[] shopCar,int id) {
        // shopCar = [g1, g2, g3, null, null, null, ...]
        for (int i = 0; i < shopCar.length; i++) {
            Goods g = shopCar[i];
            if(g != null) {
                //判断商品id是不是查找的
                if(g.getId() == id) {
                    return g;
                }
            } else {
                // 遍历到最后都没找到
                return null;
            }
        }

        // 假设100个商品都存在并且找完了100个商品都没有找到
        return null;
    }

    public static void updateGoods(Goods[] shopCar, Scanner sc) {
        // 根据用户输入ID修改对应商品
        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.getName() + "商品最新购买数量");
                int buyNumber = sc.nextInt();
                g.setBuyNumber(buyNumber);
                System.out.println("修改完成");
                queryGoods(shopCar);
                break;
            }
        }
    }

    public static void queryGoods(Goods[] shopCar) {
        System.out.println("==========查询购物车信息如下==========");
        System.out.println("编号\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.getId() + "\t\t" + g.getName() + "\t\t" + g.getPrice() + "\t\t" + g.getBuyNumber());
            } else {
                // 遍历结束
                break;
            }
        }
    }

    public static void addGoods(Goods[] shopCar, Scanner sc) {
        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();

        Goods g = new Goods();
        g.setId(id);
        g.setName(name);
        g.setBuyNumber(buyNumber);
        g.setPrice(price);

        // Goods push in array
        // shopCar = [a, a2, numm, .....]
        for (int i = 0; i < shopCar.length; i++) {
            // 寻找位置
            if(shopCar[i] == null){
                // 说明此位置没有元素存入
                shopCar[i] = g;
                // 结束,商品成功存入,不需要再找位置了
                break;
            }
            System.out.println("您的商品" + g.getName() + "已经添加到购物车");
        }
    }
}