Java EE-面向对象基础

一、类、对象

类:是对象共同特征的描述。

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

1.定义类

public class 类名 {

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

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

}

如何得到类的对象                                                                如何使用对象

类名  对象名 = new 类名();                                                        访问属性:对象名.成员变量

Car c2 = new Car();                                                                   访问行为:对象名.方法名(...)

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

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

    public void run(){
        System.out.println(name + " 价格是:" + price +", 跑的很快!");
    }
}
  
/**
   目标:掌握自己设计类,并获得对象。
 */
public class Test {
    public static void main(String[] args) {
        // 如何去获取汽车的对象。
        Car c1 = new Car();
        System.out.println(c1);
        c1.name = "宝马X3";
        c1.price = 37.89;
        System.out.println(c1.name);
        System.out.println(c1.price);
        c1.start();
        c1.run();

        System.out.println("-------------------");
        Car c2 = new Car();
        c2.name = "奔驰GLC";
        c2.price = 39.89;
        System.out.println(c2.name);
        System.out.println(c2.price);
        c2.start();
        c2.run();

    }
}

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

⚫ 类名首字母建议大写,且有意义,满足“驼峰模式”。

⚫ 一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。

 1.对象放在哪个位置?

        ⚫ 堆内存中

2. 对象变量在内存哪个位置,其中存储的是什么?

        ⚫ 栈内存中,存储的是对象在堆内存中的地址

3. 成员变量的数据放在哪里,存在于哪个位置?

        ⚫ 对象中,存在于堆内存中。

垃圾回收:

⚫ 注意:当堆内存中的类对象或数组对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。

⚫ Java存在自动垃圾回收器,会定期进行清理。 

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

 

需求

模拟购物车模块的功能,需要实现添加商品到购物车中去,同时需要提供修改商品的 购买数量,结算商品价格功能(请使用面向对象编程思想)。

分析

⚫ 购物车本身就是一个对象: 可以使用数组对象代表它。

⚫ 购物车中的每个商品都是一个对象,需要定义一个商品类。

⚫ 完成界面架构,让用户选择操作的功能。

 

public class Article {
    String name;
    double price;
    int buyNumber; // 购买数量
}
import java.util.Scanner;

/**
    需求:模拟购物车的功能。
    1、定义一个商品类:Article(属性:名称、价格)
    2、定义一个数组容器存储商品对象的,代表购物车对象。
 */
public class Test {
    public static void main(String[] args) {
        // a、定义一个数组存储商品对象的,代表购物车对象。
        Article[] shopCar = new Article[10];

        // b、让用户选择功能
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("添加商品:add");
            System.out.println("查看商品:query");
            System.out.println("修改数量:update");
            System.out.println("结算价格:pay");
            System.out.println("请您选择要操作的功能:");
            String command = sc.next();
            switch (command) {
                case "add":
                    // 把商品加入到购物车中去。
                    addArticle(shopCar);
                    break;
                case "query":
                    // 查看购物车中的商品信息
                    queryArticle(shopCar);
                    break;
                case "update":
                    updateArticle(shopCar);
                    break;
                case "pay":
                    calcPayMoney(shopCar);
                    break;
                default:
                    System.out.println("当前命令输入有误!");
            }
        }
    }

    private static void calcPayMoney(Article[] shopCar) {
        queryArticle(shopCar);
        // 准备一个double类型的变量统计总金额
        double money = 0;
        for (int i = 0; i < shopCar.length; i++) {
            Article a = shopCar[i];
            if(a != null){
                money += (a.price * a.buyNumber);
            }else {
                break;
            }
        }
        System.out.println("本次商品购买的总价为:" + money);
    }

    public static void updateArticle(Article[] shopCar ) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请您输入要修改数量的商品名称:");
            String name = sc.next();
            Article a = getArticleByName(name , shopCar );
            if(a != null){
                System.out.println("请您输入修改后购买的数量:");
                int buyNumber = sc.nextInt();
                a.buyNumber = buyNumber;
                System.out.println("该商品的购买数量修改了!");
                break;
            }else {
                System.out.println("购物车中没有该商品信息");
            }
        }
    }

    public static Article getArticleByName(String name , Article[] shopCar){
        for (int i = 0; i < shopCar.length; i++) {
            Article a = shopCar[i];
            if(a != null && a.name.equals(name) ){
                return a;
            }
        }
        return null;
    }

    public static void queryArticle(Article[] shopCar) {
        System.out.println("商品名称\t商品价格\t商品的购买数量");
        // 展示购物车的商品信息
        for (int i = 0; i < shopCar.length; i++) {
            Article a = shopCar[i];
            if(a != null){
                System.out.println(a.name +"\t" + a.price + "\t" + a.buyNumber);
            }else {
                return;
            }
        }
    }

    public static void addArticle(Article[] shopCar) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入商品的名称:");
        String name = sc.next();
        System.out.println("请您输入商品的价格:");
        double price = sc.nextDouble();
        System.out.println("请您输入购买商品的数量:");
        int buyNumber = sc.nextInt();

        // 创建一个商品对象,封装这些数据
        Article a = new Article();
        a.name = name;
        a.price = price;
        a.buyNumber = buyNumber;

        // 遍历这个购物车数组对象,看哪个位置是null,如果是null ,把商品对象添加进去
        for (int i = 0; i < shopCar.length; i++) {
            if(shopCar[i] == null){
                shopCar[i] = a; // 把商品对象添加到这个位置了
                break;
            }
        }
        System.out.println("添加成功!");
    }
}

三、构造器

构造器的作用

⚫ 用于初始化一个类的对象,并返回对象的地址。

构造器的定义格式

修饰符 类名(形参列表){

         ...

}

 

public class Car {
    ...
    // 无参数构造器
    public Car(){
        ...
}
    // 有参数构造器
    public Car(String n, String b){
        ...
    }
}

初始化对象的格式

类名 对象名称 = new 构造器;

Car c = new Car();

构造器的分类

⚫ 无参数构造器(默认存在的):初始化的对象时,成员变量的数据均采用默认值。

⚫ 有参数构造器:在初始化对象的时候,同时可以为对象进行赋值。 

 

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;
    }
}
/**
    目标:明白构造器的作用和分类。(开发的人,理解能力好)
 */
public class ConstructorDemo {
    public static void main(String[] args) {
        Car c = new Car();
//        c.name = "";
//        c.price
        System.out.println(c.name);
        System.out.println(c.price);

        Car c2 = new Car("奔驰GLC", 39.78);
        System.out.println(c2.name);
        System.out.println(c2.price);
    }
}

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

 

/**
    目标:说出this关键字的作用,并学会其使用。
 */
public class ThisDemo {
    public static void main(String[] args) {
        Car c = new Car("宝马X3", 37.89);
        System.out.println(c);
        System.out.println(c.name);
        System.out.println(c.price);

        c.goWith("奔驰GLC");
    }
}

五、封装

封装

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

⚫ 什么是封装? 隐藏实现细节,暴露出合适的访问方式。(合理隐藏、合理暴露)

封装的实现步骤

⚫ 一般对成员变量使用private(私有)关键字修饰进行隐藏,private修饰后该成员变量就只能在当前类中访问。

⚫ 提供public修饰的公开的getter、setter方法暴露其取值和赋值。

public class Student {
    // private私有的成员变量,只能在本类访问。
   private int age;

   public int getAge(){
       return age;
   }

   public void setAge(int age){
        if(age >= 0 && age <= 200){
            this.age = age;
        }else {
            System.out.println("年龄数据有问题,应该不是人的年龄!");
        }
   }
}
/**
    目标:学会面向对象的三大特征:封装的形式、作用。
 */
public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        // s.age = -23;
        s.setAge(23);
        System.out.println(s.getAge());
    }
}

六、JavaBean

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

标准JavaBean须满足如下要求:

⚫ 成员变量使用 private 修饰。

⚫ 提供每一个成员变量对应的 setXxx() / getXxx()

⚫ 必须提供一个无参构造器

通用代码菜单--快捷键:

右键-->选择Generate-->Getter and Setter选择-->shift全选-->ok

ALT+inster 可选有参、无参

 

 

 

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

 

public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setName("二狗");
        user.setHeight(163);
        user.setSalary(50000);
        user.setAddress("中国");
        user.setPhone("13141314520");
//        String name = user.getName();
//        System.out.println(name);
        System.out.println(user.getName());
        System.out.println(user.getHeight());
        System.out.println(user.getSalary());
        System.out.println(user.getAddress());
        System.out.println(user.getPhone());

        System.out.println("--------------------");
        User user1 = new User(176, "黑马吴彦祖", 30000, "黑马", "110");
        System.out.println(user1.getName());
        System.out.println(user1.getHeight());
        System.out.println(user1.getSalary());
        System.out.println(user1.getAddress());
        System.out.println(user1.getPhone());
    }
}

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

区别成员变量局部变量
类中位置不同类中,方法外常见于方法中
初始化值不同有默认初始化值没有,使用之前需要完成赋值
内存位置不同堆内存栈内存
生命周期不同随着对象的创建而存在,随着对象的消 失而消失随着方法的调用而存在,随着方法的运行结束 而消失
作用域在所归属的大括号中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值