JAVA基础 面向对象编程

一、什么是面向对象编程

  • 面向就是拿或找的意思
  • 对象就是东西的意思
  • 面向对象编程就是拿或找东西过来编程

二、设计类和对象、定义类注意事项

1、如何定义类

public class 类名{

    1、成员变量(代表属性,一般是名词)

    2、成员方法(代表行为,一般是动词)

    3、构造器

    4、代码块

    5、内部类

}

2、如何得到类的对象

类名 对象名 = new 类名();

Car c = new Car();

3、如何使用对象

  • 访问属性:对象名.成员变量
  • 访问行为:对象名.方法名()

4、自己设计对象并使用

1)Car.java

public class Car {
//属性(成员变量)
    String name;
    double price;

//行为(方法)
    public void start(){
    System.out.println(name+",价格是:"+price+"启动了");
}

 public void run(){
    System.out.println(name+",价格是:"+price+"启动了");
}

2)Test.java

public class Test {
    public static void main(String[] args) {
//类名 对象名 = new 类名();
          Car c = new Car();
          c.name = "奔驰";
          c.price = 39;        
          System.out.println(c.name);
          System.out.println(c.price);
c.start();
c.run(); }

5、定义类的注意事项

  • 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;  一般无需指定初始化值,存在默认值
  • 类名首字母建议大写,且有意义,满足“驼峰模式”
  • 一个java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名
  • 实际开发中建议还是一个文件定义一个class类

三、购物车案例

1、Goods.java

package com.hello.object;

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

2、ShopCarTest.java

package com.hello.object;

/*
目标:面向编程训练,购物车模块模拟
 */

import java.util.Scanner;

public class ShopCarTest {
    public static void main(String[] args) {
        //1、定义商品类,用于后期创建商品对象
        //2、定义购物车对象,使用一个数组对象表示。(严格来说不应该使用数组的,因为不确定长度)
        //现在数组要装商品对象,类本身也是类型
        Goods[] shopCar = new Goods[100];
        //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);
            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、遍历购物车数组中的全部商品对象,累加单价*数量
        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 scanner) {
        //让用户输入要修改商品的id,根据id要修改的商品对象
        while (true) {
            System.out.println("请您输入要修改的商品id:");
            int id = scanner.nextInt();
            Goods g = getGoodsById(shopCar,id);
            if(g == null){
                //没有该商品
                System.out.println("对不起,没有购买该商品");
            }else {
                //说明存在该商品对象,可以修改它了
                System.out.println("请您输入:"+g.name+"商品最新购买数量:");
                int buyNumber = scanner.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){
                //判断这个商品对象的id是否是我们要找的
                if(g.id==id){
                    return g;
                }
            }
            else {
                return null;//找完了全面存在的商品,都没有找到
            }

        }
        return null;//代表找完了100个商品都没有找到id一样的商品
    }

    /**
    查询购物车中的商品对象信息,并展示出来
     */
    public static void queryGoods(Goods[] shopCar) {
        System.out.println("========查询购物车信息如下============");
        System.out.println("编号\t\t名称\t\t\t价格\t\t\t购买数量");
        //shopCar = [g1,g2,g3]
        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;
            }
        }
    }

    /**
     完成商品添加到购物车的功能
     */
    //main方法已经new了一个扫描器对象了,在它调用addGoods方法时可以把对象当作参数传进入,此时addGoods方法需要用一个形参scanner接收
    public static void addGoods(Goods[] shopCar,Scanner scanner) {
        //1、录入用户输入的购买商品的信息
        System.out.println("请您输入购买商品的编号(不重复)");
        int id = scanner.nextInt();
        System.out.println("请您输入购买商品的名称:");
        String name = scanner.next();
        System.out.println("请您输入购买商品的数量:");
        int buyNumber = scanner.nextInt();
        System.out.println("请您输入购买商品的价格:");
        double price = scanner.nextDouble();

        //2、把这个购买商品的信息封装成一个商品对象
        Goods g = new Goods();
        g.id = id;
        g.name = name;
        g.buyNumber = buyNumber;
        g.price = price;

        //3、把这个商品对象添加到购物车数组中去
        //shopCar = [null,null,null]
        for (int i = 0; i < shopCar.length; i++) {
            if(shopCar[i]==null){
                //说明此位置没有元素存入,把我们新买的商品添加到此处即可
                shopCar[i] = g;
                break;//结束,因为商品已经成功存入了,不需要继续找位置了
            }
        }
        System.out.println("您的商品:"+ g + "已经添加到购物车");

    }
}

四、面向对象语法:构造器、this

1、构造器

1)Car.java

package com.hello.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;
    }
}

2)Test.java

package com.hello.constructor;

/**
 * 目标:说出对象是通过构造器初始化出来的,并理解构造器的分类和区别
 * 一、构造器的作用:用于初始化一个类的对象,并返回对象的地址 Car c = new Car();
 * 二、构造器的定义格式   修饰符 类名(形参列表){}
 * 三、构造器的分类:
 * 1、无参数构造器(默认存在的):初始化的对象时,成员变量的数据均采用默认值
 * 2、有参数构造器:在初始化对象的时候,同时可以为对象进行赋值
 * 四、注意事项:
 * 1、任何类定义出来,默认就自带了无参数构造器,写不写都有
 * 2、一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写一个无参数构造器了
 */

public class Test {
    public static void main(String[] args) {
        Car c = new Car();//调用无参数构造器
        Car c2 = new Car("宝马",80);//调用有参数构造器

    }
}

2、this关键字

1)Car.java

package com.hello.constructor;

public class Car {
    String name;
    double price;

    //this出现在有参数构造器中的用法
    public Car(String name,double price){
        System.out.println("有参数构造器被触发执行");
        /**当局部变量跟成员变量的名称一样时,以下赋值是赋给局部变量
        name = name;
        price = price;

         比如调用 Car c = new Car("奔驰",45)
                 c.name; //该值为空,因为调的是成员变量的名称,而上面的赋值是赋给了局部变量
         */
        
        this.name = name;
        this.price = price;
         
    }
    
    //this出现在成员方法中的用法
    public void goWith(String name){
        //this.name取的是成员变量的值,name取的是局部变量的值
        System.out.println(this.name + "正在和" + name + "一起比赛");
    }
}

2)Test.java

package com.hello.constructor;

/**
 * 目标:this关键字
 * 一、作用:出现在成员方法、构造器中代表当前对象的地址,用于访问当前对象的成员变量、成员方法
 * 二、掌握this出现在有参数构造器中的用法 和 this出现在成员方法中的用法
 */

public class Test {
    public static void main(String[] args) {
        //调用有参数构造器,给成员变量赋值
        Car c = new Car("宝马",80);

        //调用成员方法,给成员方法的局部变量赋值
        //最终的输出结果是:宝马和奔驰一起比赛
        c.goWith("奔驰");
    }
}

五、三大特征之一:封装、Javabean

package com.hello.javabean;

public class Student {
     /*
    面向对象的三大特征:封装、继承、多态
    一、封装:隐藏实现细节,暴露出合适的访问方式(合理隐藏、合理暴露)
    二、封装的实现步骤
    1、一般对成员变量使用private(私有)关键字修饰进行隐藏,private修饰后该成员变量就只能在当前类中访问
    2、提供public修饰的公开的getter、setter方法暴露其取值和赋值
    三、封装的好处
    1、加强了程序代码的安全性
    2、适当的封装可以提升开发效率,同时可以让程序更容易理解与维护
     */
    /*
    以下是把age做了封装
     */
/*
    private int age;

    //取值的方法:getAge
    public int getAge(){
        return age;
    }

    //赋值的方法:setAge
    public void setAge(int age){
        if(age>=0&&age<=200){
            this.age = age;
        }else {
            System.out.println("年龄非法");
        }
    }
 */


    /*目标:理解JavaBean,并学习其定义规范
    一、JavaBean:可以理解成实体类,其对象可以用于在程序中封装数据
    实体类:在现实世界中能够找到实际的个体,比如老师、学生(创建学生对象可以封装学生数据,创建汽车对象可以封装汽车数据)
    二、标准JavaBean须满足以下要求:
    1、成员变量使用private修饰
    2、提供每一个成员变量对应的setXxx() / getXxx()
    3、必须提供一个无参构造器
     */

    //1、成员变量私有
    private String name;
    private double height;
    private double salary;

    //3、必须有无参数构造器(默认的)

    public Student() {
    }

    //4、有参数构造器(不是必须的,可以选择)


    public Student(String name, double height, double salary) {
        this.name = name;
        this.height = height;
        this.salary = salary;
    }

    //2、必须提供成套的getter  和 setter方法暴露成员变量的取值和赋值
    public String getName() {
        return name;
    }

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

    public double getHeight() {
        return height;
    }

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

    public double getSalary() {
        return salary;
    }

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

六、JavaBean改造购物车

1、Goods.java

package com.tech.testcase;

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

2、ShopCarTest.java

package com.tech.testcase;

import java.util.Scanner;

/*
目标:面向编程训练,购物车模块模拟——javabean改造购物车案例
 */

public class ShopCarTest {
    public static void main(String[] args) {
        //1、定义商品类,用于后期创建商品对象
        //2、定义购物车对象,使用一个数组对象表示。(严格来说不应该使用数组的,因为不确定长度)
        //现在数组要装商品对象,类本身也是类型
        Goods[] shopCar = new Goods[100];
        //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);
            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、遍历购物车数组中的全部商品对象,累加单价*数量
        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 void updateGoods(Goods[] shopCar,Scanner scanner) {
        //让用户输入要修改商品的id,根据id要修改的商品对象
        while (true) {
            System.out.println("请您输入要修改的商品id:");
            int id = scanner.nextInt();
            Goods g = getGoodsById(shopCar,id);
            if(g == null){
                //没有该商品
                System.out.println("对不起,没有购买该商品");
            }else {
                //说明存在该商品对象,可以修改它了
                System.out.println("请您输入:"+g.getName()+"商品最新购买数量:");
                int buyNumber = scanner.nextInt();
                g.setBuyNumber(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){
                //判断这个商品对象的id是否是我们要找的
                if(g.getId()==id){
                    return g;
                }
            }
            else {
                return null;//找完了全面存在的商品,都没有找到
            }

        }
        return null;//代表找完了100个商品都没有找到id一样的商品
    }

    /**
     查询购物车中的商品对象信息,并展示出来
     */
    public static void queryGoods(Goods[] shopCar) {
        System.out.println("========查询购物车信息如下============");
        System.out.println("编号\t\t名称\t\t\t价格\t\t\t购买数量");
        //shopCar = [g1,g2,g3]
        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\t"+g.getPrice()+"\t\t\t"+g.getBuyNumber());
            }else {
                //遍历结束
                break;
            }
        }
    }

    /**
     完成商品添加到购物车的功能
     */
    //main方法已经new了一个扫描器对象了,在它调用addGoods方法时可以把对象当作参数传进入,此时addGoods方法需要用一个形参scanner接收
    public static void addGoods(Goods[] shopCar,Scanner scanner) {
        //1、录入用户输入的购买商品的信息
        System.out.println("请您输入购买商品的编号(不重复)");
        int id = scanner.nextInt();
        System.out.println("请您输入购买商品的名称:");
        String name = scanner.next();
        System.out.println("请您输入购买商品的数量:");
        int buyNumber = scanner.nextInt();
        System.out.println("请您输入购买商品的价格:");
        double price = scanner.nextDouble();

        //2、把这个购买商品的信息封装成一个商品对象
        Goods g = new Goods();
        g.setId(id);
        g.setName(name);
        g.setBuyNumber(buyNumber);
        g.setPrice(price);

        //3、把这个商品对象添加到购物车数组中去
        //shopCar = [null,null,null]
        for (int i = 0; i < shopCar.length; i++) {
            if(shopCar[i]==null){
                //说明此位置没有元素存入,把我们新买的商品添加到此处即可
                shopCar[i] = g;
                break;//结束,因为商品已经成功存入了,不需要继续找位置了
            }
        }
        System.out.println("您的商品:"+ g.getName() + "已经添加到购物车");

    }
}
原文地址:https://www.cnblogs.com/Chilam007/p/15616919.html