第七章 面向对象基础

第七章 面向对象基础


前言

提示:这里可以添加本文要记录的大概内容:

面向:找、拿
对象:东西
面向对象编程:找或拿东西过来编程
面向对象编程的好处:符合人类思维习惯,编程更简单、更好理解


提示:以下是本篇文章正文内容,下面案例可供参考

一、设计对象并使用

1、设计类,创建对象并使用

  • 类(设计图):是对象共同特征的描述
  • 对象:是真实存在的具体案例
  • 结论:在Java中,必须先设计类,才能创建对象并使用
  • 如何设计类?
    在这里插入图片描述
  • 如何得到类的对象
    在这里插入图片描述
  • 如何适用对象
    在这里插入图片描述

2、定义类的几个补充注意事项

package com.itheima.createobject;

import java.sql.SQLOutput;

/**
    目标:理解定义类的几个补充注意事项,为后续知识的学习做准备
 */
public class Test2 {
    public static void main(String[] args) {
        /* 1、类名首字母建议大写,且有意义,满足“驼峰模式”,不能是关键字,
            必须是合法标识符,且有意义。*/

        /* 2、一个Java文件中可以定义多个class类,且只能一个类是public修饰,
            而且public修饰的类名必须成为代码文件名。
            注意:实际开发花时间一一个代码只定义一个类*/

        /* 3、成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;
            一般无需指定初始化值,存在默认值。

            默认值规则
            byte、short、int、long     0
            float、double             0.0
            boolean                  false
            String等引用类型           null
         */
       Student s = new Student();
       System.out.println(s.name);
       System.out.println(s.flag);
    }
}
  • 对象的成员变量的默认值规则
    在这里插入图片描述

二、对象在内存中的运行机制

1、多个对象的内存图

  • 两个对象内存图
    在这里插入图片描述
    在这里插入图片描述

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

在这里插入图片描述

  • 垃圾回收
    1、注意:当堆内存中的对象,没有任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
    2、Java存在自动垃圾回收器,会定期进行清理

三、面向对象编程训练:模拟购物车模块

需求分析、架构搭建

在这里插入图片描述
在这里插入图片描述

添加商品到购物车、查看购物车信息

在这里插入图片描述
在这里插入图片描述

修改购买数量

在这里插入图片描述
在这里插入图片描述

结算金额

在这里插入图片描述
在这里插入图片描述
Goods代码

package com.itheima.demo;

public class Goods {
    int id;  //编号
    String name;  //名称
    double price;  //价格
    int buyNumber;  //购买数量
}

shopCarTest代码

package com.itheima.demo;

import java.util.Scanner;

/**
    目标:面向对象编程训练,购物车模块模拟
 */
public class ShopCarTest {
    public static void main(String[] args) {
        //1、定义商品类,用于后期创建商品对象
        //2、定义购物车对象,使用一个数组对象表示
        Goods[] shopCar = new Goods[100]; //[null, null, ...]
        //3、搭建操作架构
        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) {
        queryGoods(shopCar);
        //1、定义一个求和变量累加金额
        double money = 0;
        //2、遍历购物车数组中的全部商品对象,累加单价*数量
        //[g1, g2, null, ......]
        for (int i = 0; i < shopCar.length; i++) {
            Goods g = shopCar[i];
            if (g != null){
                money += (g.price * g.buyNumber);
            }else {
                break;
            }
        }
        System.out.println("订单总金额:" + money);
    }

    public 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.name + "商品最新的购买数量:");
                int buyNumber = sc.nextInt();
                g.buyNumber = buyNumber;
                System.out.println("修改完成!");
                queryGoods(shopCar);
                break;
            }
        }
    }

    public static Goods getGoodsById(Goods[] shopCar, int id){
        //shopCar = [g1, g2, g3, null, null, ...]
        for (int i = 0; i < shopCar.length; i++) {
            Goods g = shopCar[i];
            if(g != null){
                //判断这个商品对象的id是否是我们要找的
                if (g.id == id){
                    return g;
                }
            }else {
                return null;  //找完了前面存在的商品,都没有找到
            }
        }
        return null;  //找完了100个商品,没有找到
    }

    /**
        查询购物车中的商品对象信息,并展示出来
     */
    public static void queryGoods(Goods[] shopCar) {
        System.out.println("============查询购物车信息============");
        System.out.println("编号\t\t名称\t\t\t价格\t\t\t购买数量");
        //shopCar = [g1, g2, g3, null, null, ...]
        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.id = id;
        g.name = name;
        g.buyNumber = buyNumber;
        g.price = price;
        
        //3、把这个商品对象添加到购物车数组中去
        //shopCar = [a, a2, null, ......]
        //                    i
        for (int i = 0; i < shopCar.length; i++) {
            if (shopCar[i] == null){
                //说明此位置没有元素存入,把我们新买的商品添加到此处即可
                shopCar[i] = g;
                break; //结束,因为商品已经存入成功了,不需要继续找位置了
            }
        }
        System.out.println("您的商品:" + g.name + "已成功添加到购物车!");
    }
}

四、构造器

目的:

1、真正知道对象具体是通过调用什么代码得到的
2、能够掌握为对象赋值的其他简便写法
3、为以后学习面向对象编程的其他内容做支撑

构造器的作用

  • 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。在这里插入图片描述

构造器的格式

在这里插入图片描述

调用构造器得到对象的格式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

构造器的分类和作用

  • 无参数构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值。
  • 有参数构造器:在初始化对象的时候,同时可以接受参数为对象进行赋值。

Car代码

package com.itheima.constructor;

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

Test代码

package com.itheima.constructor;

/**
    目标:认识构造器,明白两种类型的构造器的作用
 */
public class Test {
    public static void main(String[] args) {
        //通过调用构造器得到对象
        Car c = new Car();
        c.name = "宝马";
        c.price = 38.9;
        System.out.println(c.name);
        System.out.println(c.price);

        //调用有参数构造器
        Car c2 = new Car("奔驰",39.8);
        System.out.println(c2.name);
        System.out.println(c2.price);
    }
}

构造器的注意事项

  • 任何类定义出来,默认就自带了无参数构造器,写不写都有。
  • 一旦定义了有参数构造器,那么无参数构造器就没有了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器了。
    在这里插入图片描述
    在这里插入图片描述

五、this关键字

this关键字是什么

  • 可以出现在构造器、方法中
  • 代表当前对象的地址
    在这里插入图片描述

this关键字的作用

  • 可以用于指定访问当前对象的成员变量、成员方法。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

六、封装

封装思想概述

封装

  • 面向对象的三大特征:封装,继承,多态。
  • 封装:告诉我们,如何正确设计对象的属性和方法。
  • 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

如何更好的封装

  • 一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)。
  • 为每个成员变量提供配套public修饰的getter、setter方法暴露其取值和赋值。
    在这里插入图片描述
    在这里插入图片描述

七、标准JavaBean

JavaBean

  • 也可以称为实体类,其对象可以用于在程序中封装数据。
    在这里插入图片描述

标准JavaBean须满足如下书写要求:

  • 成员变量使用private修饰
  • 提供成员变量对应的setXxx() / getXxx()方法。
  • 必须提供一盒无参构造器;有参构造器时可写可不写的。

补充知识:成员变量、局部变量区别

在这里插入图片描述

面向对象综合案例

在这里插入图片描述
movie代码

package com.itheima.demo;

public class Movie {
    //1、成员变量
    private String name;
    private double score;
    private String actor;

    //无参数构造器
    public Movie() {
    }

    //有参数构造器
    public Movie(String name, double score, String actor) {
        this.name = name;
        this.score = score;
        this.actor = actor;
    }

    //2、getter + setter

    public String getName() {
        return name;
    }

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

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }
}

Test代码

package com.itheima.demo;

/**
    目标:完成电影信息的展示案例,理解面向对象编程的代码

    “《长津湖》” , 9.7 ,“吴京”
    “《我和我的父辈》” , 9.6 ,“吴京”
    “《五个扑水的少年》” , 9.5 ,“王川”
 */
public class Test {
    public static void main(String[] args) {
        //1、设计电影类
        //2、创建3个电影对象,封装电影的信息
        //3、定义一个电影类型的数组,存储3部电影对象
        Movie[] movies = new Movie[3];
        movies[0] = new Movie("《长津湖》", 9.7 ,"吴京");
        movies[1] = new Movie("《我和我的父辈》", 9.6 ,"吴京");
        movies[2] = new Movie("《五个扑水的少年》", 9.5 ,"王川");

        //4、遍历数组中的每个电影对象,然后获取她的信息展示出来
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            System.out.println("电影名:" + m.getName());
            System.out.println("评分:" + m.getScore());
            System.out.println("主演:" + m.getActor());
            System.out.println("---------------------");
        }
    }
}

在这里插入图片描述
结论:数组中存储的元素并不是对象本身,而是对象的地址。

总结

以上是Java面向对象编程的基础知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值