【Java从入门到大牛】面向对象编程 àì夳堔傛蜴生んèń 2024-04-26 02:41 87阅读 0赞 > ? 本文由 [程序喵正在路上][Link 1] 原创,CSDN首发! > ? 系列专栏:[Java从入门到大牛][Java] > ? 首发时间:2023年7月11日 > ? 欢迎关注?点赞?收藏?留言? > ? 一以贯之的努力 不得懈怠的人生 #### 目录 #### * 面向对象编程快速入门 * 深刻认识面向对象 * 对象在计算机中的执行原理 * 类和对象的一些注意事项 * this * 构造器 * 封装 * 实体JavaBean(实体类) * 面向对象编程综合案例 * 补充知识:成员变量、局部变量的区别 ## 面向对象编程快速入门 ## 案例:打印学生的总成绩和平均成绩 **需求** 每个学生有两门成绩:语文成绩和数学成绩,请开发程序打印出每个学生的总成绩和平均成绩 **代码示例** 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 出来的,有了类就可以创建出对象 ## 对象在计算机中的执行原理 ## ![在这里插入图片描述][c8e00031942c49f2bfb9d06c72f6b312.png] 每次 `new Student()`,就是在堆内存中开辟一块内存区域代表一个学生对象,s1 变量里面记住的就是学生对象的地址 s1 变量中存储的是对象的地址,因此变量 s1 也称为引用类型的变量 ## 类和对象的一些注意事项 ## * 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car… * 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为) * 成员变量本身存在默认值,在定义成员变量时一般来说不需要赋初始值(没有意义) * 一个代码文件中,可以写多个 class 类,但是只能有一个用 public 修饰,且 public 修饰的类名必须称为代码文件名 * 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了 * 如果某个对象没有一个变量引用它,则该对象也就无法被操作,会变成所谓的垃圾对象 ## this ## **什么是 this** this 就是一个变量,可以用在方法中,来拿到当前对象 ![在这里插入图片描述][52267a81e6b64713908e00a39c15604c.png] **this 的应用场景** this 主要用来解决变量名称冲突的问题 ![在这里插入图片描述][ab0e66157bf94d8e86a4bbfaa75c6a6c.png] 当对象的成员变量与方法内部变量的名称一样时,就可以来 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("您输入的命令有问题~~"); } } } } **运行效果** **功能一** ![在这里插入图片描述][392257d054674ef59c21dc4740f9bc52.png] **功能二** ![在这里插入图片描述][38dc77f698d142d8bdad3a949815f4a5.png] ## 补充知识:成员变量、局部变量的区别 ## <table> <thead> <tr> <th>区别</th> <th>成员变量</th> <th>局部变量</th> </tr> </thead> <tbody> <tr> <td>类中位置不同</td> <td>类中,方法外</td> <td>常见于方法中</td> </tr> <tr> <td>初始化值不同</td> <td>有默认值,不需要初始化赋值</td> <td>没有默认值,使用之间必须完成赋值</td> </tr> <tr> <td>内存位置不同</td> <td>堆内存</td> <td>栈内存</td> </tr> <tr> <td>作用域不同</td> <td>整个对象</td> <td>在所归属的大括号中</td> </tr> <tr> <td>生命周期不同</td> <td>与对象共存亡</td> <td>随着方法的调用而生,随着方法的运行结束而亡</td> </tr> </tbody> </table> [Link 1]: https://blog.csdn.net/weixin_62511863?spm=1011.2421.3001.5343 [Java]: https://blog.csdn.net/weixin_62511863/category_12365679.html?spm=1001.2014.3001.5482 [c8e00031942c49f2bfb9d06c72f6b312.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/26cffd3206994815bc91e01dcde7c121.png [52267a81e6b64713908e00a39c15604c.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/91f09c53a0fd41a482165a14d4f4aac7.png [ab0e66157bf94d8e86a4bbfaa75c6a6c.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/71e48843eb8b4973a5ce8d655acb56ff.png [392257d054674ef59c21dc4740f9bc52.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/32d04e9e855849a0a4b82a68b3870cf5.png [38dc77f698d142d8bdad3a949815f4a5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/e38a48d1703d443e8d448e35f2be36c4.png
相关 【Java从入门到大牛】Java高级技术 注解(Annotation)就是 Java 代码里的特殊标记,比如:@Override、@Test 等,作用是:让其他程序根据注解信息来决定怎么执行该程序自定义注解,就是... 忘是亡心i/ 2024年04月26日 02:57/ 0 赞/ 75 阅读
相关 【Java从入门到大牛】多线程 什么是线程安全问题?多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题取钱的线程安全问题场景:小明和小红是一对夫妻,他们有一个共同的账户,余额是10万元,如果... 谁借莪1个温暖的怀抱¢/ 2024年04月26日 02:55/ 0 赞/ 67 阅读
相关 【Java从入门到大牛】编程思维训练 本文讲解了几个小案例,巩固了之前学习Java的一些基础知识,同时积累了一定的代码量 本是古典 何须时尚/ 2024年04月26日 02:40/ 0 赞/ 74 阅读
还没有评论,来说两句吧...