🔥 本文由 程序喵正在路上 原创,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("您输入的命令有问题~~");
}
}
}
}
运行效果
功能一
功能二
补充知识:成员变量、局部变量的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 | 常见于方法中 |
初始化值不同 | 有默认值,不需要初始化赋值 | 没有默认值,使用之间必须完成赋值 |
内存位置不同 | 堆内存 | 栈内存 |
作用域不同 | 整个对象 | 在所归属的大括号中 |
生命周期不同 | 与对象共存亡 | 随着方法的调用而生,随着方法的运行结束而亡 |