【Java从入门到大牛】面向对象编程

🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:Java从入门到大牛
🌠 首发时间:2023年7月11日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🌟 一以贯之的努力 不得懈怠的人生

面向对象编程快速入门

案例:打印学生的总成绩和平均成绩

需求

每个学生有两门成绩:语文成绩和数学成绩,请开发程序打印出每个学生的总成绩和平均成绩

代码示例

public class Test {
    public static void main(String[] args) {
        printTotalScore("小明", 99, 99);
        printAverageScore("小明", 99, 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);
    }
}

上面这种实现方式叫做面向过程编程,它是开发一个一个的方法,当有数据要处理了,我们就调用方法来处理

什么是面向对象编程

开发一个一个的对象来处理数据,把数据交给对象,再调用对象的方法来完成对数据的处理

前面的案例如果用面向对象编程,是什么样的呢 ?

代码示例

Student.java

// 学生类
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);
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        s.name = "小明";
        s.Chinese = 99;
        s.math = 99;
        s.printTotalScore();
        s.printAverageScore();
    }
}

看起来好像比面向过程编程麻烦多了,为什么会出现这种方式呢 ?

深刻认识面向对象

面向对象编程有什么好处

如果我们要处理手机的数据,就找手机对象来处理

如果我们要处理汽车的数据,就找汽车对象来处理

面向对象编程的好处就是符合人类的思维习惯,能够让编程更简单、更直观

什么是对象

对象本质上是一种特殊的数据结构

对象从何而来

class 也就是类,也称为对象的设计图或者对象的模板

对象就是用类 new 出来的,有了类就可以创建出对象

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

在这里插入图片描述

每次 new Student(),就是在堆内存中开辟一块内存区域代表一个学生对象,s1 变量里面记住的就是学生对象的地址

s1 变量中存储的是对象的地址,因此变量 s1 也称为引用类型的变量

类和对象的一些注意事项

  • 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…
  • 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)
  • 成员变量本身存在默认值,在定义成员变量时一般来说不需要赋初始值(没有意义)
  • 一个代码文件中,可以写多个 class 类,但是只能有一个用 public 修饰,且 public 修饰的类名必须称为代码文件名
  • 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了
  • 如果某个对象没有一个变量引用它,则该对象也就无法被操作,会变成所谓的垃圾对象

this

什么是 this

this 就是一个变量,可以用在方法中,来拿到当前对象

在这里插入图片描述

this 的应用场景

this 主要用来解决变量名称冲突的问题
在这里插入图片描述

当对象的成员变量与方法内部变量的名称一样时,就可以来 this 来区别开

构造器

什么是构造器

public class Student {
	// 构造器
	public Student() {
		...
	}
}

构造器的特点

创建对象时,对象会去调用构造器

构造器的常见应用场景

创建对象时,同时完成对对象成员变量的初始化赋值

构造器的注意事项

  • 类在设计时,如果不写构造器,Java 是会为类自动生成无参构造器的
  • 一旦定义了有参数构造器,Java 就不会再帮我们自动生成无参构造器了,此时建议手写一个无参数构造器

封装

面向对象的特征

面向对象有三大特征:封装、继承、多态

什么是封装 ?

封装就是在用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去

封装的设计规范

合理隐藏,合理暴露

代码层面控制对象的成员公开或隐藏

  • 公开成员,可以使用 public(公开)进行修饰
  • 隐藏成员,使用 private(私有、隐藏)进行修饰

实体JavaBean(实体类)

什么是实体类 ?

就是一种特殊形式的类

实体类的特点

  • 实体类中的成员变量都要私有,并且要对外提供相应的 getXxx、setXxx 方法
  • 类中必须要有一个公共的无参构造器
  • 仅仅只是一个用来保存数据的 Java 类,可以用它来创建对象,保存某个事物的数据

实体类的应用场景

实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离

面向对象编程综合案例

案例

模仿电影信息系统

需求

  • 展示系统中的全部电影,包括每部电影的名称和价格
  • 允许用户根据电影编号(id)查询出某个电影的详细信息

需求

  • 设计一个电影类
  • 设计一个电影操作类

代码示例

Movie.java

// 电影类
public class Movie {
    private int id;             // 编号
    private String name;        // 名称
    private double price;       // 价格
    private double score;       // 评分
    private String director;    // 导演
    private String actor;       // 主演
    private String info;        // 其他信息

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

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

    // get、set方法
    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 double getScore() {
        return score;
    }

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

    public String getDirector() {
        return director;
    }

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

    public String getActor() {
        return actor;
    }

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

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

MovieOperator.java

// 电影操作类
public class MovieOperator {
    private Movie[] movies;     // 电影数组
    public MovieOperator(Movie[] movies){
        this.movies = movies;
    }

    /** 1、展示系统全部电影信息 movies = [m1, m2, m3, ...]*/
    public void printAllMovies(){
        System.out.println("-----系统全部电影信息如下:-------");
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            System.out.println("编号:" + m.getId());
            System.out.println("名称:" + "《" + m.getName() + "》");
            System.out.println("价格:" + m.getPrice());
            System.out.println("------------------------");
        }
        System.out.println();
    }

    /** 2、根据电影的编号查询出该电影的详细信息并展示 */
    public void searchMovieById(int id){
        for (int i = 0; i < movies.length; i++) {
            Movie m = movies[i];
            if(m.getId() == id){
                System.out.println("该电影详情如下:");
                System.out.println("编号:" + m.getId());
                System.out.println("名称:" + "《" + m.getName() + "》");
                System.out.println("价格:" + m.getPrice());
                System.out.println("得分:" + m.getScore());
                System.out.println("导演:" + m.getDirector());
                System.out.println("主演:" + m.getActor());
                System.out.println("其他信息:" + m.getInfo() + "\n");
                return; // 已经找到了电影信息,没有必要再执行了
            }
        }
        System.out.println("没有该电影信息~");
    }
}

TestMovieSystem.java

import java.util.Scanner;
/**
 功能:电影信息展示; 根据电影id查询该电影详情
 */
// 主方法
public class TestMovieSystem {
    public static void main(String[] args) {
        // 创建电影数据
        Movie[] movies = new Movie[4];
        movies[0] = new Movie(1,"长安三万里", 45, 9.4, "谢君伟/邹靖", "杨天翔/凌振赫/吴俊全","2.51亿票房");
        movies[1] = new Movie(2, "八角笼中", 46, 9.5, "王宝强", "王宝强/陈永胜/史彭元","9.58亿票房");
        movies[2] = new Movie(3,"消失的她", 43, 9.2, "崔睿/刘翔", "朱一龙/倪妮/文咏珊","31.37亿票房");
        movies[3] = new Movie(4,"扫毒3: 人在天涯", 45, 9.1, "邱礼涛", "古天乐/郭富城/刘青云/杨采钰","1.96亿票房");

        // 创建一个电影操作类的对象,接收电影数据,并对其进行业务处理
        MovieOperator operator = new MovieOperator(movies);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("=========电影信息系统=========");
            System.out.println("1、查询全部电影信息");
            System.out.println("2、根据id查询某个电影的详细信息展示");
            System.out.print("请您输入操作命令: ");
            int command = sc.nextInt();

            switch (command) {
                case 1:
                    // 展示全部电影信息
                    operator.printAllMovies();
                    break;
                case 2:
                    // 根据id查询某个电影的详细信息展示
                    System.out.print("请您输入查询的电影id:");
                    int id = sc.nextInt();
                    operator.searchMovieById(id);
                    break;
                default:
                    System.out.println("您输入的命令有问题~~");
            }
        }
    }
}

运行效果

功能一

在这里插入图片描述

功能二

在这里插入图片描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序喵正在路上

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值