当前位置: 首页 > news >正文

Java从入门到精通 - 面向对象编程基础

面向对象编程基础

此笔记参考黑马教程,仅学习使用,如有侵权,联系必删

文章目录

  • 面向对象编程基础
    • 1. 面向对象编程快速入门
      • 代码实现
    • 2. 深刻认识面向对象
      • 2.1 面向对象编程的好处?
      • 2.2 程序中的对象到底是个啥?
      • 2.3 对象是怎么出来的?
      • 总结
    • 3. 对象在计算机中的执行原理
      • 总结
      • 多学一招
    • 4. 类和对象的一些注意事项
    • 5. this
      • 5.1 this 是什么
      • 5.2 this 的执行原理
      • 5.3 this 有啥引用场景
      • 代码实现
      • 总结
    • 6. 构造器
      • 6.1 构造器是什么样子?
      • 6.2 构造器有什么特点?
      • 6.3 构造器的常见应用场景
      • 6.4 构造器的注意事项
      • 代码实现
      • 总结
    • 7. 封装
      • 7.1 什么是封装?
      • 代码实现
      • 总结
    • 8. 实体 JavaBean
      • 8.1 什么是实体类?
      • 8.2 实体类有什么应用场景?
      • 代码实现
      • 总结
    • 9. 面向对象编程综合案例
      • 模仿电影信息系统
        • 代码实现
    • 10. 补充知识:成员变量、局部变量的区别
    • 总结

写程序的道路

1. 面向对象编程快速入门

计算机的本质是用来处理数据的,我们用变量、数组等形式来把数据拿到程序中去

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

代码实现

需求:

  • Student.java
package m_oop;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
package m_oop;public class Test {public static void main(String[] args) {// 目标:面向对象编程快速入门// 1. 创建一个学生对象,封装播妞的数据Student s1 = new Student(); // 同一个包下可以自动去访问【类本身可以做为一个类型】s1.name = "播妞"; // 可以理解为属性s1.chinese = 100;s1.math = 100;s1.printTotalScore(); // 播妞的总成绩是:200.0s1.printAverageScore(); // 播妞的平均成绩是:100.0// 2. 再创建一个学生对象,封装播仔的数据Student s2 = new Student();s2.name = "播仔";s2.chinese = 59;s2.math = 100;s2.printTotalScore(); // 播仔的总成绩是:159.0s2.printAverageScore(); // 播仔的平均成绩是:79.5}
}

2. 深刻认识面向对象

2.1 面向对象编程的好处?

在祖师爷(詹姆斯·高斯林)看来万物皆对象

eg:

  • 汽车的数据找汽车对象处理
  • 手机的数据找手机对象处理
  • 学生的数据找学生对象处理

所有一句话总结就是,面向对象编程符合人类思维习惯,编程更简单、更直观

2.2 程序中的对象到底是个啥?

温馨提示:Java 语言长久以来,一直没有人能把面向对象讲得直观且具体,方便初学者理解,所以可以选择自己认为更好的理解思路,这里仅供参考

  • 对象本质上是一种特殊的数据结构
  • 类似于现实中一张表格,表格具体张什么样就要看对象张什么样
    • 创建(new)一个对象时,相当于在计算机里创建了一张表,把数据给到这个对象相当于填了这张表,调用这个对象的方法时处理的就是这个对象的数据了

2.3 对象是怎么出来的?

  • class 也就是,也称为对象的设计图(或者对象的模板
    • 我们开头写的那个类就是来设计这个表的
    • class 后面跟名字,就是用来说用来设计一个什么对象(也就是设计一个什么表)
    • class 里面设计一些变量,变量就是表里面一些字段,字段用来描述对象要处理什么数据
    • class 里面设计一些方法,这些方法用来说明对数据进行怎样的处理

总结

  1. 面向对象编程有啥好处?
  • 凡是找对象的编程套路,更加符合人类的思维习惯,编程也会更直观
  1. 对象是啥?如何得到?
  • 对象就是一种特殊的数据结构

    public class 类名{1. 变量,用来说明对象可以处理什么数据2. 方法,描述对象有什么功能,也就是可以对数据进行什么样的处理...
    }
    
  • 对象是用类 new 出来的,有了类就可以创建出对象

    类名 对象名 = new 类名();
    
  1. 面向对象编程这种套路是咋回事?
  • 祖师爷认为万物皆对象,谁的数据谁处理

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

总结

  1. 对现在计算机中的执行原理是怎么回事?
  • Student s1 = new Student();
  • 每次 new Student(),就是在堆内存中开辟一块内存区域代表一个学生对象
  • s1 变量里面记住的是学生对象的地址

多学一招

  1. 如何识别引用类型的变量?
  • Student s1 = new Student();
  • s1 变量中存储的是对象的地址,因此变量 s1 也称为引用类型的变量

4. 类和对象的一些注意事项

  • 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car、…
  • 类中定义的变量也称之为成员变量(对象的属性),类中定义的方法也称之为成员方法(对象的行为)【每个对象都有一份属于自己的成员变量】
  • 成员变量本身存在默认值,在定义成员变量时一般来说不需要赋初始值(没有意义)
    修饰符 数据类型 变量名称 =;
    
数据类型明细默认值
基本类型byte、short、char、int、long0
float、double0.0
booleanfalse
引用类型数组、Stringnull
  • 一个代码文件中,可以写多个 class 类,但只能一个用 public 修饰,且 public 修饰的类名必须成为代码文件名
  • 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了

  • 如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象
    • Java 存在自动垃圾回收机制,会自动清楚掉垃圾对象,程序员不用操心


5. this

(如果学过 python 的话,this 类似于 python 中的 self)

5.1 this 是什么

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

5.2 this 的执行原理

  • 简单来说就是 this 能记住对象创建的这个表的地址

5.3 this 有啥引用场景

  • this 主要用来解决:变量名称冲突问题

代码实现

  • Test.java
package n_thisdemo;public class Test {public static void main(String[] args) {// 目标:认识this,拿捏this的应用场景Student s1 = new Student();System.out.println(s1); // n_thisdemo.Student@b4c966as1.printTest(); // n_thisdemo.Student@b4c966aSystem.out.println("------------------");Student s2 = new Student();System.out.println(s2); // n_thisdemo.Student@2f4d3709s2.printTest(); // n_thisdemo.Student@2f4d3709Student s3 = new Student();s3.score = 325;s3.printPass(250); // 恭喜您,您成功考入了哈佛大学了~~~}
}
  • Student.java
package n_thisdemo;public class Student {double score;public void printTest() {System.out.println(this);}public void printPass(double score) {if(this.score > score){System.out.println("恭喜您,您成功考入了哈佛大学了~~~");}else {System.out.println("落选了~");}}
}

总结

  1. this 关键字是什么?
  • this 就是一个变量,可以用在方法中,用来拿到当前对象;哪个对象调用方法,this 就指向哪个对象,也就是拿到哪个对象
  1. this 关键字在实际开发中常用来干啥?
  • 用来解决对象的成员变量与方法内部变量的名称一样时,导致访问冲突问题的

6. 构造器

可以类比 python 构造函数(init)

6.1 构造器是什么样子?

  • 构造器是一种特殊的方法,特殊之处在于名字必须与所在类的名字一模一样,而且不能写返回值类型
  • 只要参数列表不一样就可以写多个构造器
public class Student {/** 构造器 */public Student() {...}
}

6.2 构造器有什么特点?

  • 创建对象时,对象会去调用构造器
Student s = new Student();

6.3 构造器的常见应用场景

  • 创建对象时,同时完成对对象成员变量(属性)的初始化赋值

6.4 构造器的注意事项

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

代码实现

  • Student.java
package o_constructor;public class Student {String name;double score;// 无参数构造器public Student() {System.out.println("无参数构造器被触发执行了~~~");}// 有参数构造器public Student(String name, double score) {System.out.println("有参数构造器被触发执行了~~~");this.name = name;this.score = score;}
}
  • Teacher.java
package o_constructor;public class Teacher {public Teacher() {}public Teacher(String name) {}
}
  • Test.java
package o_constructor;public class Test {public static void main(String[] args) {// 目标:认识构造器,并掌握构造器的特点、应用场景、注意事项Student s = new Student("Feng", 99);Student s1 = new Student();s1.name = "张三";s1.score = 100;Student s2 = new Student("李四", 59); // 有参数构造器被触发执行了~~~System.out.println(s2.name); // 李四System.out.println(s2.score); // 59.0Teacher t = new Teacher(); // 这里明明没有写构造器,但是这里可以调,就说明,我们在设计这个老师类的时候如果你没有写构造器,Java会自动帮我们生成一个无参的构造器Teacher t1 = new Teacher("王五");}
}

总结

  1. 构造器长什么样子?
public class Student {/** 构造器 */public Student() {...}
}
  1. 构造器在哪里调用,我们常用它来干嘛?
  • 对象创建时,我们可以指定对象去调用哪个构造器执行
  • 构造器常用于完成对象初始化(常用的应用场景是完成对象的成员变量的初始化赋值)
  1. 构造器在使用时,有哪两个注意事项
  • 类在设计时,如果不写构造器,Java 会为类自动生成一个无参构造器
  • 一旦定义了有参构造器,Java 就不会帮我们的类生成无参构造器了,此时就建议自己手动写一个无参构造器出来了

7. 封装

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

7.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);}
}

封装设计规范:合理隐藏、合理暴露

什么意思呢?

  • 比如一个汽车里面有很多元器件,发动机、优先、悬挂等等,但汽车的设计者不会把这些全部暴露给你,把汽车的内部元器件都隐藏起来,外部只会暴露一些用户需要的成员给你,比如方向盘、启动按钮等等

代码实现

  • Student.java
package p_encapsulation;public class Student {private double score;public void setScore(double score) {if (score >= 0 && score <= 100) {this.score = score;} else {System.out.println("数据非法~~~");}}public double getScore() {return score;}public void printPass() {System.out.println(score >= 60 ? "成绩及格" : "成绩不及格");}
}
  • Test.java
package p_encapsulation;public class Test {public static void main(String[] args) {// 目标:掌握封装的设计规范:合理隐藏、合理暴露Student s1 = new Student();s1.setScore(99);System.out.println(s1.getScore()); // 99.0}
}

总结

  1. 什么是封装?
  • 就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去
  1. 封装的设计规范是什么样的?
  • 合理隐藏、合理暴露
  1. 代码层面如何控对象的成员公开或隐藏?
  • 公开成员,可以使用 public (公开)进行修饰
  • 隐藏成员,使用 private (私有,隐藏)进行修饰

8. 实体 JavaBean

8.1 什么是实体类?

  • 就是一种特殊形式的类
  1. 这个类中的成员变量都要私有,并且要对外提供相应的 getXxxsteXxx 方法

  2. 类中必须要有一个公共的无参的构造器

8.2 实体类有什么应用场景?

我们在开发一个 Java 类时如果发现一个类承载的职责过多,也就是一个类里面即封装了存取数据相关的方法,又封装了处理数据相关的业务方法的时候。我们通常会对这些职责进行拆分,数据存储相关的方法交给一个 Java 类来处理,把数据处理相关的业务方法挪给另一个 Java 类中去管理,以实现数据和数据处理相分离

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

代码实现

  • Student.java
package q_javabean;public class Student {// 1. 必须私有成员变量,并为每个成员变量提供get、set方法private String name;private double score;// 2. 必须为类提供一个公开的无参数构造器public Student() {}public Student(String name, double score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}
}
  • StudentOperator.java
package q_javabean;public class StudentOperator {private Student student;public StudentOperator(Student student) {this.student = student;}public void printPass() {if (student.getScore() >= 60) {System.out.println(student.getName() + "学生成绩及格");} else {System.out.println(student.getName() + "学生成绩不及格");}}
}
  • Test.java
package q_javabean;public class Test {public static void main(String[] args) {// 目标:掌握实体类的书写要求、特点、应用场景Student s1 = new Student();s1.setName("张三");s1.setScore(99);System.out.println(s1.getName()); // 张三System.out.println(s1.getScore()); // 99.0StudentOperator operator = new StudentOperator(s1);operator.printPass(); // 张三学生成绩及格}
}

总结

  1. 什么是实体类?有啥特点?
  • 成员变量必须私有,且为他们提供 get、set 方法;必须有无参数构造器
  • 仅仅只是一个用来保存数据的 java 类,可以用它创建对象,保存某个事物的数据
  1. 实体类有啥应用场景?
  • 实体类对应的是软件开发里现在比较流行的开发方式,数据和数据的业务处理相分离

9. 面向对象编程综合案例

模仿电影信息系统

需求:

  • 展示系统中的全部电影(每部电影展示:名称、价格)
  • 允许用户根据电影编号(id)查询出某个电影的详细信息
代码实现
  • Movie.java
package r_demo;public class Movie {private int id;private String name;private double price;public String getName() {return name;}public void setName(String name) {name = name;}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;}public int getId() {return id;}public void setId(int id) {this.id = id;}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
package r_demo;public class MovieOperator {private Movie[] movies;public MovieOperator(Movie[] movies){this.movies = movies;}// 1. 展示系统全部电影信息public void printAllMovie(){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("-------------------------");}}// 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());return; // 已经找到电影详细,没有必要再执行了}}System.out.println("没有该电影信息~~~");}
}
  • Test.java
package r_demo;import java.util.Scanner;/*** 目标:完成电影信息展示功能:根据电影id查询该电影详情* 电影数据:* 1, "水门桥", 38.9, 9.8, "徐克", "吴京", "12万人想看"* 2, "出拳吧", 39, 7.8, "唐晓白", "田雨", "3.5万人想看"* 3, "月球陨落", 42, 7.9, "罗兰", "贝瑞", "17.9万人想看"* 4, "一点就到家", 35, 8.7, "徐安宇", "刘昊然", "10.8万人想看"*/
public class Test {public static void main(String[] args) {// 1. 设计一个电影类// 2. 设计一个电影的操作类// 3. 准备全部电影信息Movie[] movies = new Movie[4];movies[0] = new Movie(1, "水门桥", 38.9, 9.8, "徐克", "吴京", "12万人想看");movies[1] = new Movie(2, "出拳吧", 39, 7.8, "唐晓白", "田雨", "3.5万人想看");movies[2] = new Movie(3, "月球陨落", 42, 7.9, "罗兰", "贝瑞", "17.9万人想看");movies[3] = new Movie(4, "一点就到家", 35, 8.7, "徐安宇", "刘昊然", "10.8万人想看");// 4. 创建一个电影操作类的对象,接收电影数据,并对其进行业务处理MovieOperator operator = new MovieOperator(movies);
//        operator.printAllMovie();
//        operator.searchMovieById(3);Scanner sc = new Scanner(System.in);while (true) {System.out.println("==电影信息系统==");System.out.println("1. 查询全部电影信息");System.out.println("2. 根据id查询某个电影的详细信息展示");System.out.println("请您输入操作命令:");int command = sc.nextInt();switch (command) {case 1:// 展示全部电影信息operator.printAllMovie();break;case 2:// 根据id查询某个电影的详细信息System.out.println("请您输入要查询的电影id:");int id = sc.nextInt();operator.searchMovieById(id);break;default:System.out.println("您输入的命令有问题~~~");}}}
}

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

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

总结


http://www.xdnf.cn/news/702991.html

相关文章:

  • 将can日志数据提取到excle中
  • HOMIE——遥操类似ALOHA主从臂的外骨骼驾驶舱收集数据:通过上肢模仿学习和全身控制RL训练自主策略
  • JVM虚拟机监控及性能调优实战!
  • mqtt c语言publish topic
  • 6 质量控制中的常用缩略语和符号(OEE)以及解释
  • 嵌入式学习之系统编程(七)线程的控制(互斥与同步)和死锁
  • CPG开源项目对比
  • 18度的井水
  • C++补充基础小知识:为什么要继承、什么时候继承、什么时候直接用
  • 高并发计数器LongAdder 实现原理与使用场景详解
  • Jmeter性能测试(应用场景、性能测试流程、搭建测试环境)
  • 实例与选项对象
  • SpringBoot+Vue+Echarts实现可视化图表的渲染
  • 自动生成程序的heap文件
  • #!/usr/bin/env python
  • JS中的属性描述符
  • Day 20
  • 生成式引擎在不同行业的应用案例
  • 第十章 Java基础-Static静态变量
  • 基于物理约束的稀疏IMU运动捕捉系统
  • spring和Mybatis的各种查询
  • Rust 学习笔记:使用迭代器改进 minigrep
  • 力扣刷题Day 61:子集(78)
  • 【案例94】笛卡尔积导致报“临时表空间不足”
  • bat 批处理通过拖拽,来获取拖入文件的信息
  • 【25-cv-00656】Whitewood律所代理Olga Drozdova 蝴蝶版权图维权案
  • 【Web应用】若依框架:基础篇07功能详解-定时任务
  • 不同坐标系下的 面积微元
  • Android-Room + WorkManager学习总结
  • 2G Nand Jlink烧录报错Failed to allocated 0x1B000000 bytes of memory!