面向对象回顾(二)

构造器、this关键字、封装以及JavaBean

面向对象回顾(二)

这是Java面向对象的语言特征,也是后期在项目开发中应该遵守的约定
构造器
无参构造器
有参构造器
*ps在进行封装的时候,如果出现了有参构造器则也同时一定需要无参构造器
*
this关键字
结合代码来说,会更加具体一些。参考下面这段代码:

public class Student{
    String name;
    private void SetName(String name){
        this.name = name;
    }
}

这段代码中,创建了一个类Student,有成员变量name与成员方法SetName(String name),由于成员方法接收的形参名称与成员变量相同,都是name,所以,这里可以使用this关键字来调用本类中的成员变量。其作用可以简单的这么理解:this关键字就是调用本类中的成员变量。

但是这样简单的理解并不准确,this其实是当前类对象的引用,通过当前这个类实例化的对象的引用来访问对象的成员变量。

注意:

this关键字访问类的成员变量和成员函数时不受访问权限的控制,可以访问本类中所有的成员变量和方法,包括private的成员变量和方法。也可以通过this访问本类的static成员,不过由于static成员可以通过类名直接访问,如果通过this来访问会有“The static field ××× should be accessed in a static way”的警告信息。不能在类的static成员或static块中使用this。
封装
封装时可以采用快捷方式!
JavaBean
JavaBean代表了实物类
例如test等测试类则不属于javabean

JavaBean改造的购物车案例

Goods商品类代码

package ObjectOriented;

public class Goods {
    private int id; //商品编号
    private String name; //商品名称
    private double price; //商品价格
    private int buynumber; //商品购买数量

    //无参构造器

    public Goods() {
    }
    //有参构造器

    public Goods(int id, String name, double price, int buynumber) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.buynumber = buynumber;
    }

    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;
    }
}

购物车测试类代码

package ObjectOriented;

import java.util.Scanner;

//JavaBean方式进行改造

public class ShopCar {
    public static void main(String[] args) {
        //定义商品类,用于后期创建商品对象
        //定义一个购物车对象,使用一个数组表示
        Goods[] shopCar = new Goods[100]; //Goods为新建的类名,也是所创建购物车数组的类型名
        //搭建操作架构
        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":
                    addGGoods(shopCar,sc);
                    break;
                case "query":
                    queryGoods(shopCar);
                    break;
                case "update":
                    updateGoods(shopCar,sc);
                    break;
                case "pay":
                    payGoods(shopCar);
                    break;
                default:
                    System.out.println("没有该功能!");
            }
        }
    }

    private static void payGoods(Goods[] shopCar) {
        //显示购物车内的商品信息
        queryGoods(shopCar);
        //定义一个变量来承接购物车累加总金额
        double money = 0;
        //遍历购物车数组,并且使每个商品的数量*单价进行求和
        for (int i = 0; i < shopCar.length ;i++) {
            Goods g = shopCar[i];
            if(g != null){
                money += (g.getBuynumber() * g.getPrice());
            }
            else{
                break;
            }
        }
        System.out.println("购物车内订单的总金额为" + money);
    }

    private static void updateGoods(Goods[] shopCar,Scanner sc) {
        //让用户输入要修改的商品id ,根据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;
            }
        }

    }
    //单独的方法根据id查找商品信息
    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.getId() == id){
                    return g;
                }
                else{
                    return null;
                }
            }
        }
        return null; //代表找完了100个商品都没有找的id一样的商品
    }

    private 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.getId()+"\t\t"+g.getName()+"\t\t"+g.getBuynumber()+"\t\t"+g.getPrice());
            }
            else{
                break;
            }
        }
    }

    private static void addGGoods(Goods[] shopCar,Scanner sc) {//上方已经存在一个录入扫描器,使用参数承接则无需在方法中再次建立扫描器
        //录入商品商品的信息
        System.out.println("请录入购买商品的信息:");
        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);
        //把商品对象添加到购物车数组中去
        for (int i = 0; i < shopCar.length; i++) {
            if(shopCar[i] == null){
                //说明此位置没有元素存入
                shopCar[i] = g;
                break;//商品添加成功
            }
        }
        System.out.println("您的商品" + g.getName() + "已经成功加入购物车");

    }
}

以上介绍的几种语法则是Java的一种语法特点
也是后期工程开发的一种标准
我们应该尊重语言特点,规范语言书写!

明天见!

上一篇:12. 面向对象基础


下一篇:Redis5种常用数据类型的使用以及内部编码