首页 > 其他分享 >6. 面向对象(重点)

6. 面向对象(重点)

时间:2024-03-14 22:00:51浏览次数:20  
标签:name 对象 void 面向对象 Student 重点 public String

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());


    }
}


  • 到此教程就结束了.
  • 转载: 请附上本文链接.
  • 如果文章对你有帮助, 可以点赞收藏一下, 以防下次需要可以快速找到.

标签:name,对象,void,面向对象,Student,重点,public,String
From: https://blog.csdn.net/qq_42013947/article/details/136723057

相关文章

  • Go语言中的面向对象编程(OOP)
    在Go语言中,虽然没有像面向对象语言那样的类,但通过结构体类型和方法,仍然支持部分面向对象编程(OOP)的概念。封装(Encapsulation)封装是一种将一个对象的实现细节隐藏起来,使其对其他对象不可见的做法,这样可以实现解耦。例如,考虑以下结构体:typeStudentstruct{namestring......
  • 面向对象设计的六大原则(SOLID原则)-——里氏替换原则
    里氏替换原则(LiskovSubstitutionPrinciple,LSP)是面向对象设计的基本原则之一,由BarbaraLiskov提出。它表明,如果程序中的对象使用的是基类型的话,那么无论它实际上使用的是哪一个子类的对象,程序的行为都不会发生改变。简单来说,子类型必须能够替换它们的基类型,而且替换后程序的行......
  • JAVA学习日记五(面向对象-高级)
    1.关键字:static如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(或类属性)!使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类被修饰后的成员具备以下特点:随着类的加载而加载优先于对象存在修饰的成员,被所有对象所共享访问权限......
  • JAVA学习日记四(面向对象-基础)
    1.面向对象概述面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!2.Java的基本元素:类和对象类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。对象:实际存在的该类事......
  • 论面向对象的建模及应用
        本文旨在探讨面向对象的建模在软件系统开发中的应用。首先,概述了作者参与的一个实际的软件系统开发项目,并详细描述了在该项目中担任的主要工作。接着,深入阐述了用例模型和分析模型的概念、作用以及在实际项目中的具体应用。最后,分析了在使用这两种模型过程中遇到的......
  • python--类与面向对象-2
    类与面向对象中一些重要函数讲解一、对象在文本中的输出classPerson:    def__init__(self,name,agg,live_value,money):        self.name=name        self.agg=agg        self.live_value=live_value ......
  • 从JavaSE到项目部署——Java基础学习第八天(Java面向对象编程初级)
    目录一、类与对象(OOP)——类        1、类与对象概述    2、对象在内存中的存在形式     3、属性/成员变量/field(字段)     4、对象创建和使用    5、对象创建过程二、方法    1、方法基本演示    2、方......
  • Java面向对象:类与对象
    Java面向对象:类与对象在Java编程中,面向对象是一种重要的编程范式。其中,类与对象是构建面向对象程序的基本组件。本文将深入探讨Java中类与对象的概念,并提供一些练习加深理解。类与对象的概念在Java中,类是对象的模板或蓝图,它定义了对象的属性和行为。对象是类的实例,具有类......
  • C++ | 二分(重点二分答案)
    常见的二分类型:1.整数二分2.小数二分(相对较少)3.二分答案(最常见)二分最直接的思想就是用O(logn)的时间较快的在数组中找见想要找的边界数,枚举时间较慢O(n)。 小数二分与整数二分的思想相一致,就不在赘述了。☆ 理解二分一定要理解的问题是答案取得是区间的右边界,则返回......
  • 面向对象(四)
    目录面向对象的三大特征说明(封装、继承、多态)封装(隐藏)继承多态继承子类扩展父类语法格式成员继承和方法的重写类成员的继承和重写查看类的继承层次结构object根类dir()查看对象属性重写str方法多重继承MRO方法解析顺序super()获得父类定义面向对象的三大......