6. 面向对象(重点)

1 面向对象

1.1 了解对象

  • 学习面向对象编程都先我们需要先思考三个问题:

1.1.1 面向对象的好处?

  • Java作者詹姆斯.高斯林说过**万物皆对象**
  • 汽车的数据可以找汽车对象处理
  • 手机数据可以找手机对象处理
  • 学生的数据可以找学生对象处理
  • 使用面向对象编程符合人类思维习惯, 就好比谁的事情谁负责.

1.1.2 程序中的对象到底是什么?

  • 对象其实就是一个具体的东西,可以使用属性(变量)和行为(方法)对其进行具体描述
  • 比如说下面汽车和学生具有的属性和行为

1.1.3 对象是怎么出来的?

  • 对象是由类创建出来的,类是创建对象的模板,对象是类的具体实现。

1.1.4 总结

  1. 在Java中一切对象
  2. 对象是一个具体的东西, 是可以属性(变量) 和行为(方法) 对其进行具体描述.
  3. 类和对象的关系: 类是对象创建的模板, 对象是类的具体实现.
  4. 目前要设计一辆车,牌子是奥迪,颜色是红色,功能是拉货, 按照面向对象的思想,应该怎么实现?
    • 首先创建一个Car的类,
    • 定义属性: String brand; String color;
    • 创建一个拉货的方法
    • 在main() 方法中创建Car类的对象, 并给对象属性赋值
    • 使用对象调用拉货方法

1.2 使用对象

1.2.1 案例: 打印出学生的总成绩、平均成绩

  • 先看看面向过程编程
  • 开发一个一个的方法,有数据要处理了,我们就调方法来处理。
public class Demo {
    public static void main(String[] args) {
        printTotalScore("播妞", 100, 100);
        printAverageScore("播妞", 100, 100);
        System.out.println("-------------------------");
        printTotalScore("播仔", 59, 99);
        printAverageScore("播仔", 59, 99);
    }
    public static void printTotalScore(String name, double chinese, double math){
        System.out.println(name + "同学的各科总分是:" + (chinese + math));
    }
    public static void printAverageScore(String name, double chinese, double math{
        System.out.println(name + "同学的各科平均分是:" + (chinese + math) / 2.0);
    }
}

  • 再看看面向对象编程
  • 开发一个一个的对象来处理数据,把数据交给对象,再调用对象的方法来完成对数据的处理。(谁的事情谁来做,谁的数据谁负责)

public class Student {
    String name;// 姓名
    double chinese; // 语文成绩
    double math; // 数学成绩
    public void printTotalScore(){
        System.out.println(name + "同学的各科总分是:" + (chinese + math));
    }
    public void printAverageScore(){
        System.out.println(name + "同学的各科平均分是:" + (chinese + math) / 2.0);
    }
}


public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "播妞";
        s1.chinese = 100;
        s1.math = 100;
        s1.printTotalScore();
        s1.printAverageScore();
        Student s2 = new Student();
        s2.name = "播仔";
        s2.chinese = 59;
        s2.math = 99;
        s2.printTotalScore();
        s2.printAverageScore();
    }
}

  • 这么一写突然发现有一点点的麻烦啊
  • 那么要进行一个班同学的成绩打印, 那么使用面向对象编程, 是不是就容易非常多了

1.2.2 总结:

  1. 面向对象思想主张: 谁的事情谁做, 谁的数据谁负责
  2. 类是创建对象的模板, 它里面包含的两项主要元素是: 属性(bianliang) 和行为(方法)
public class 类名{
    // 1、属性: 变量, 用来描述对象可以处理什么数据
    // 2、动作: 方法,描述对象有什么功能
}

  1. 有了类, 如何创建一个对象
    • 类名 对象名 = new 类名();
  2. 一个类可以创建多个对象

1.3 案例练习

1.3.1 类和对象的一些注意事项

  • 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…
  • 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为).
  • 成员变量本身存在默认值,同学们在定义成员变量时一般来说不需要赋初始值(没有意义).
数据类型明细默认值
基本类型byte, short, char, int, long0
基本类型float, double0.0
基本类型booleanfalse
引用类型数组, Stringnull
  • 对象名要求和类名相似,但是需要首字母小写,建议和类名同名.
  • 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名.

1.3.2 案例一 面向对象编程练习——掌握类和对象的使用

  • 定义一个“手机(Phone)”类,有以下成员:

    • 成员属性:品牌(brand)、颜色(color)、价格(price)
    • 成员方法:打电话(call)、发短信(sendMsg)
  • 定义测试类,创建两个手机对象,并调用两个方法!

    • 正在使用价值2999.0的黑色华为手机打电话
    • 正在使用价值1999.0的粉色小米手机发短信
  • 完整代码:

package com.itheima.b_case;

/*
    定义一个“手机(Phone)”类,有以下成员:
        成员属性:品牌(brand)、颜色(color)、价格(price)
        成员方法:打电话(call)、发短信(sendMsg)
    定义测试类,创建两个手机对象,并调用两个方法!
        正在使用价值2999.0的黑色华为手机打电话
        正在使用价值1999.0的粉色小米手机发短信
*/

/**
 * @ClassName Phone
 * @Author LXHYouth
 * @Date 2024/3/14 19:57
 * @Version: 1.0
 * @Description 创建手机类, 定义其属性和行为
 **/

public class Phone {
    String brand;
    String color;
    double price;

    public void call(){
        System.out.println("正在使用价值"+price+"的"+color+brand+"手机打电话");
    }
    public  void sendMassage(){
        System.out.println("正在使用价值"+price+"的"+color+brand+"手机发短信");
    }

}
/**
 * @ClassName Test
 * @Author LXHYouth
 * @Date 2024/3/14 19:56
 * @Version: 1.0
 * @Description 测试类, 创建对象, 对对象属性赋初始值, 并调用方法
 **/
class Test{
    public static void main(String[] args) {
        // 创建两个手机对象
        Phone phone = new Phone();
        Phone phone2 = new Phone();
        // 对两个对象属性赋初始值
        phone.brand="华为";
        phone.color="黑色";
        phone.price=2999;
        phone2.brand="小米";
        phone2.color="粉色";
        phone2.price=1999;
        // 通过对象调用方法
        phone.call();
        phone2.sendMassage();
    }
}

1.4 内存图

1.4.1 对象在计算机中的执行原理

1.4.2 如果某个对象没有任何变量指向它了, 需要注意什么?

  • 注意:当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
  • Java存在自动垃圾回收机制,会自动清除掉垃圾对象,程序员不用操心。

1.4.3 总节:

  1. Student s1 = new Student()在计算机中的执行原理是
  • 每次new Student(),就是在堆内存中开辟一块空间,代表一个学生对象
  • s1变量里面记住的是学生对象的内存地址值
  1. 如何识别一个变量是引用类型的变量?
  • 这个变量中如果存储的是内存的地址值,那么他就是一个引用类型的变量
  1. 执行Student s1 = null 在计算机中会发生什么?
  • 变量s1中保存的内存地址值会被设置为null
  • 地址值对应的内存区域如果没有其它变量引用,就会被垃圾回收器自动回收

2 封装

  • 面向对象的三大特性: 封装, 继承, 多态

2.1 封装理论

2.1.1 什么是封装

  • 在面向对象的程序设计中,应当把对象属性和行为设计到对象内部去,而且对象中的数据不能被随意访问。
public class Student {
    String name;// 姓名
    double chinese; // 语文成绩
    double math; // 数学成绩
    public void printTotalScore(){
        System.out.println(name + "同学的各科总分是:" + (chinese + math));
    }
    public void printAverageScore(){
        System.out.println(name + "同学的各科平均分是:" + (chinese + math) / 2.0);
    }
}

2.1.2 为什么要封装

  • 在类中默认定义的变量是随时可被其他类访问、修改,是不安全的

2.1.3 封装的设计规范

  • 将成员属性修饰为“private”,表示“私有”

  • 可以被本类其它成员访问,但不能被其它类访问.

  • 不能直接访问Student对象的属性

  • 只能通过get/set方法间接访问!!!

  • 如果熟练书写了get/set方法, 就可以使用IDEA自动生成

  • 在参数下面一行, 鼠标右键, 选择Generate

  • 选择 Getter and Setter

  • 键盘按住 Shift ,鼠标点击左后一个属性, 进行全选, 然后点击OK

  • 这样就自动生成所有属性的get和set方法了

2.1.4 总结

  1. 什么是封装?
  • 在程序设计中,应当把对象属性和行为设计到对象内部去,而且对象中的数据不能被随意访问.
  1. 为什么要封装?
  • 在类中默认定义的变量是随时可被其他类访问、修改,是不安全的
  1. 如何封装?
  • 使用private修饰成员变量(public进行修饰公开成员,private 进行修饰私有成员)
  1. 封装之后如何访问数据
  • 提供对应变量的set/get方法

2.2 this关键字

2.2.1 this是什么

  • this就是一个变量,可以用在方法中,用来代表当前方法所属的对象。
  • 打印出来的内存地址是相同的

2.2.2 this的应用场景

  • This可以用来: 区别成员变量和局部变量
public class Student {
    String name;
    double score;
    public void checkPass(double score){
        if(this.score >= score){
            System.out.println("恭喜您,考上哈佛,走向巅峰~~~");
        }else {
            System.out.println("不好意思,您没有考上~~~");
        }
    }
}

2.2.3 成员变量和局部变量的区别

区别成员变量局部变量
类中位置不同类中,方法外常见于方法中(形参或单独定义)
初始化值不同有默认值, 不需要初始化赋值没有默认值,使用之前必须完成赋值
内存位置不同堆内存栈内存
作用域不同整个对象在所归属的大括号中
生命周期不同与对象共存亡随着方法的调用而生,随着方法的运行结束而亡

2.2.4 this的执行原理

2.2.6 总结

  1. this关键字是什么?
  • this就是一个变量, 可以用在方法中 ,用来代表调用当前方法的对象;
  • 哪个对象调用方法,this就指向哪个对象,也就是拿到哪个对象。
  1. this关键字在实际开发中常用来干啥?
  • 用来解决对象的成员变量与方法内部变量的名称一样时,导致的访问冲突问题
  1. 成员变量和局部变量的区别
  • 类中位置、初始化值、内存位置、作用域、生命周期

2.3 构造器

2.3.1 知识理解

  • 构造器,又叫构造方法,用于创建对象,它有下面几个特点

    • 方法名必须和类名保持一致
    • 方法没有返回值,也不能使用void修饰
    • 创建对象时,构造方法会被自动调用 Student s = new Student();
    • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
  • 应用场景

    • 创建对象时,同时完成对对象成员变量(属性)的初始化赋值。
    • Student s = new Student(“张三”,12);
  • 注意事项

    • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
    • 一个类中,一旦有了有参构造方法,Java将不会再生产无参构造,此时如果需要无参构造,可以自行创建
  • 构造器想要自动生成也是跟之前get和set一样.

  • 也是右键点击选择Generate, 然后选择Constraintor

  • 无参构造直接选择 Select None

  • 再重复上述操作, 键盘按住 Shift ,鼠标点击左后一个属性, 进行全选, 然后点击OK

  • 这样就自动生成了无参和全参构造方法啦, 如果不需要全部参数的话, 在选择时可以只选择需要的参数, 然后就会生成对应的含参构造方法.

2.3.2 总结

  1. 书写格式
public class Student {
    /** 构造器 */
    public Student() {
        //...
    }
}

  • 方法名必须和类名保持一致
  • 方法没有返回值,也不能使用void修饰
  • 创建对象时,构造方法会被自动调用
  • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
  1. 应用场景
  • 可以使用全参构造器在创建对象的时候完成对变量的赋值
  1. 注意事项
  • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
  • 一个类中,一旦有了有参构造方法,Java将不会再生产无参构造,
  • 此时如果需要无参构造,可以自行创建

2.4 案例练习

2.4.1 案例: 请以“封装”的思想定义学生类,并为其定义构造方法

  • 完整代码
package com.itheima.f_case;

/**
 * @author: LXHYouth
 * @date: 2024/3/14 21:18
 * @Version:    1.0
 * @Description
 */

/*
为“学员管理系统”设计一个“学员类(Student)”:
     成员属性:学号(id)、姓名(name)、性别(sex)、年龄(age)
     成员方法:打印学员信息(print)、学习(study)
*/
public class Student {
    private int id;
    private String name;
    private char sex;
    private int age;



    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 char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /*
     * @Author LXHYouth
     * @Date 16:14 2024/3/12
     * @Param []
     * @return
     * @Description 无参构造器
     **/
    public Student(){

    }

    /*
     * @Author LXHYouth
     * @Date 16:20 2024/3/12
     * @Param [id, name, age, sex]
     * @return
     * @Description  全参构造器
     **/
    public Student(int id,String name,int age,char sex ){
        this.id=id;
        this.name=name;
        this.age=age;
        this.sex=sex;

    }

    public void print(){
        System.out.println("姓名: " +name);
        System.out.println("年龄: "+age);
        System.out.println("学号: "+ id);
        System.out.println("性别: "+ sex);
    }

    public void study(){
        System.out.println("我正在学习, 以后挣多多的钱");
    }
}

class test{
    public static void main(String[] args) {
        Student student=new Student(01,"LXHYouth",26,'男');
    }
}

3 JavaBean

3.1 介绍

3.1.1 什么是JavaBean?

  • JavaBean,又叫实体类,就是一种特殊形式的类。

3.1.2 实体类怎么使用?

  • 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。
public class Student {
    private String name;
    private double score;
    // getter setter方法
     // 打印成绩是否及格的方法
     // 打印成绩等级的方法
     // ... 
}



public class StudentOperator {
    private Student s;
    public StudentOperator (Student s){
       this.Student = s;
    }
}

3.1.3 总结:

  1. 实体类的作用和注意点是什么
  • 实体类是用来保存数据的java类,可以用它创建对象,保存某个事物的数据。
  • 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。
  1. 实体类有啥特点?
  • 成员变量必须私有,且要为他们提供get、set方法
  • 必须有无参数构造器, 可以有带参构造

3.2 练习案例

案例: 面向对象综合案例-模仿电影信息系统

  • 需求
    • 展示系统中的全部电影(每部电影展示:名称、价格)。
    • 允许用户根据电影编号(id)查询出某个电影的详细信息。
  • 目标
    • 使用所学的面向对象编程实现以上2个需求。
  • 完整代码
package com.itheima.lx;

/**
 * @author: LXHYouth
 * @date: 2024/3/14 20:31
 * @Version:    1.0
 * @Description
 */


/**
 * 实体类 javaBean
 * 负责数据存 -set 取 -get
 */
public class Movie {

//    成员属性,必须私有
    private int id;
    private String name;
    private String director;
    private double price;
//    创建set  get

    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 String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }


//    无参构造器
    public Movie() {
    }
    public Movie(int id,String name, String director, double price) {
       this.id = id;
        this.name = name;
        this.director = director;
        this.price = price;
    }
}


package com.itheima.lx;

/**
 * @author: LXHYouth
 * @date: 2024/3/14 20:31
 * @Version:    1.0
 * @Description
 */



/**
 * 电影的操作类
 *
 */
public class MovieOperator {

    Movie[] arr = {
            new Movie(1,"出拳吧,妈妈","康晓白",100),
            new Movie(2,"一点就到家", "许宏宇",79),
            new Movie(3,"月球陨落","罗兰",100),
            new Movie(4,"奇幻冒险","思明",60),
            new Movie(5,"长津湖","徐克",90)};

    /**
     * 查询所有电影
     */
    public void findAll(){
//        遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i].getName()+"价格:"+arr[i].getPrice());
        }
    }

    /**
     * 根据id 查询电影详情
     * @param id
     * @return
     */
    public Movie getMovieById(int id){

//        遍历数组
        for (int i = 0; i < arr.length; i++) {
            if(id==arr[i].getId()){
//                找到id对应的电影
                return arr[i];
            }
        }
        return null;
    }
}

package com.itheima.lx;

/**
 * @author: LXHYouth
 * @date: 2024/3/14 20:31
 * @Version:    1.0
 * @Description
 */


public class MovieTest {

    public static void main(String[] args) {

//        调用行为对象
        MovieOperator movieOperator = new MovieOperator();
//        调用行为
        movieOperator.findAll();
        System.out.println("=============================");
        Movie movie = movieOperator.getMovieById(2);
        System.out.println(movie.getName()+",价格:"+movie.getPrice());


    }
}


  • 到此教程就结束了.
  • 转载: 请附上本文链接.
  • 如果文章对你有帮助, 可以点赞收藏一下, 以防下次需要可以快速找到.
  • 55
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值