Java入门基础-07面向对象编程
本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记
目录
前言
本章是Java入门基础的重点内容之一
一、深刻认识面向对象
面向对象编程: 开发一个一个的对象来处理数据,把数据交给对象, 再调用对象的方法来完成对数据的处理。
1、面对对象编程的好处?
- 符合人类思维习惯,编程更简单、更直观
如:汽车的数据,我们会找汽车这个对象来处理;手机的数据,我们会找手机这个对象来处理;学生的数据,我们会找学生这个对象来处理。
2、程序中的对象到底是个啥?如何得到?
- 对象本质上是一种特殊的数据结构。
- 对象是用类new出来的,有了类就可以创建出对象。
- 格式:类名 对象名 = new 类名 () ;
- public class 类名{
1、变量,用来说明对象可以处理什么数据。
2、方法,描述对象有什么功能,也就是可以对数据进行什么样的处理。
…
}
3、对象是怎么出来的?
- class也就是类,也称为对象的设计图(或者对象的模板)。
二、对象在计算机中的执行原理
1、对象在计算机中的执行原理是怎么回事?
- 识别引用类型的变量:Student s1 = new Student ();
- 每次new Student()= new Student (),就是在堆内存中开辟一块内存区域代表一个学生对象。
- s1变量里面记住的是学生对象的地址。
- s1变量中存储的是对象的地址,因此变量s1也称为引用类型的变量。
三、类和对象的一些注意事项
1、类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…
2、类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)。
3、成员变量本身存在默认值,在定义成员变量时,一般来说不需要赋初始值(没有意义)。
4、一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须称为代码文件名。
5、对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了。
类Student.Java 的代码:
package com.itheima.day09;
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 com.itheima.day09;
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "小一";
System.out.println("此时s1的名字为:" + s1.name);
// 把学生类型的变量s1赋值给学生类型的变量s2
Student s2 = s1;
s2.name = "小二";
System.out.println("此时s1的名字为:" + s1.name);
}
}
运行结果为:
6、如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象。Java存在自动垃圾回收机制,会自动清除掉垃圾对象。
四、this
- this就是一个变量,可以用在方法中,来拿到当前对象。
示例:
Student.java 代码:
package com.itheima.day09.This;
public class Student {
public void printThis(){
System.out.println(this);
}
}
Test.java 代码:
package com.itheima.day09.This;
public class Test1 {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1); // 打印的是地址
s1.printThis();
System.out.println("----------------");
Student s2 = new Student();
System.out.println(s2);
s2.printThis();
}
}
运行结果:
**this应用场景:**this主要用来解决:变量名称冲突问题的。
示例:
Student.java 代码:
package com.itheima.day09.This02;
public class Student {
String name;
double score;
public void checkPass(double score){
if (this.score >= score){ // 此时this.score 拿的是s1 的成绩; 而后面的score拿的是我们放入checkPass(60)里面的。
System.out.println(name + "恭喜您,及格了~");
}else {
System.out.println(name + "很遗憾,您没有及格~");
}
}
}
Test.java 代码:
package com.itheima.day09.This02;
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "小黑";
s1.score = 67;
s1.checkPass(60); // 输入判断的标准
Student s2 = new Student();
s1.name = "小白";
s1.score = 57;
s1.checkPass(60);
}
}
运行结果:
this关键字是什么?
- this就是一个变量,可以用在方法中,用来拿到当前对象;哪个对象调用方法,this就指向哪个对象,也就是拿到哪个对象。
this关键字在实际开发中常用来干啥?
- 用来解决对象的成员变量与方法内部变量的名称一样时,导致访问冲突问题的。
五、构造器
构造器的样子:
public class Student {
/**
构造器*/
public Student(){
}
构造器有什么特点?
- 创建对象时,对象会去调用构造器。
Test.java代码:
public class Test {
public static void main(String[] args) {
Student s = new Student("波仔", 78);
Student s1 = new Student();
s1.name = "潘妞";
s1.score = 69;
}
}
Student.java
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;
}
}
运行结果:
构造器的常见应用场景: 创建对象时,同时完成对象成员变量(属性)的初始化值。
构造器在哪里调用?我们常用它来干嘛?
- 对象创建时,我们可以指定对象去调用哪个构造器执行。
- 构造器常用于完成对象初始化(常见的应用场景是完成对象的成员变量的初始化赋值)
构造器的注意事项:
- 类在设计时,如果不写构造器,Java会为类自动生成一个无参构造器的。
- 一旦定义了有参构造器,Java就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参构造器出来了。
六、封装
面向对象的三大特征:封装、继承、多态
什么是封装?
就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。
封装的设计规范:合理隐藏、合理暴露
- 合理隐藏:不让外界直接访问,即对外隐藏,只有内部才能访问,一般用 private修饰符修饰,一般为成员变量。
- 合理暴露:让外界直接访问,内部外部都可以调用,一般用 public修饰符修饰,一般为成员方法。
- 成员变量是在类中定义的变量。局部变量是在方法中定义的变量。
- 成员方法对应类中定义的方法。
代码示例
Student.java (类) 代码:
public class Student {
private double score; // 对score进行合理隐藏
/* 因为对score进行了私有化,所以外界无法调用与赋值,所以我们得设计getset方法,
让外界调用这两个方法对score进行调用与赋值。
*/
// set方法 ,可以在里面添加判断是否可以赋值的条件。
public void setScore(double score){
if (score >= 0 && score <= 100){
this.score = score;
}else {
System.out.println("数据非法。");
}
}
// get方法,用于外界调用score变量的值。
public double getScore(){
return score;
}
}
Test.java 代码:
public static void main(String[] args) {
Student s1 = new Student();
s1.setScore(-19);
System.out.println(s1.getScore()); // 输出默认值 0.0
Student s2 = new Student();
s2.setScore(289);
System.out.println(s2.getScore()); // 输出默认值 0.0
Student s3 = new Student();
s3.setScore(89);
System.out.println(s3.getScore());
}
运行结果:
七、实体JavaBean(实体类)
什么是实体类?
- 就是一种特殊的类。
特点:仅仅只是一个用来保存数据的Java类,可以用它创建对象,保存某个事物的数据。要求:
- 这个类中的成员变量都要私有,并且要对外提供相应的getXXX,setXXX方法。
2.类中必须要有一个公共的无参构造器。
实体类有啥应用场景?
实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。
快捷生成有参无参构造器,以及生成getset方法。
JavaBean示例:
Student.java :
public class Student {
// 1. 这个类中的成员变量都要私有,并且要对外提供相应的getXXX,setXXX方法。
private double score;
private String name;
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 2.类中必须要有一个公共的无参构造器。
public Student() {
}
public Student(double score, String name) {
this.score = score;
this.name = name;
}
StudentOperator.java :
package com.itheima.day07.encapsulation;
// 学生操作类
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 :
public static void main(String[] args) {
Student s1 = new Student();
s1.setScore(79);
s1.setName("小黑");
System.out.println(s1.getName());
System.out.println(s1.getScore());
StudentOperator operator = new StudentOperator(s1);
operator.printPass();
}
运行结果:
八、面向对象编程综合案例-模仿电影信息系统
需求:
- 展示系统中的全部电影(每部电影展示:名称、价格)
- 允许用户根据编号(id)查询出某个电影的详细信息。
电影数据:
名称,价格,导演,主演,其他信息
1,“水门桥”, 38.9, 9.8, “徐克”, “吴京”, “12万人想看”
2,“出拳吧”, 38.9, 9.8, “唐晓白”, “田雨”, “3.5万人想看”
3,“月球陨落”, 38.9, 9.8, “罗兰”, “贝瑞”, “17.9万人想看”
4,“一点就到家”, 38.9, 9.8, “许宏宇”, “刘昊然”, “10.8万人想看”
Movie.java:
package com.itheima.day07.encapsulation;
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;
}
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:
package com.itheima.day07.encapsulation;
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.getPrice());
System.out.println("评分:" + m.getScore());
System.out.println("---------------------------");
}
}
/**2.允许用户根据编号(id)查询出某个电影的详细信息。*/
public void searchMovie(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("没有该电影信息");
}
}
MovieTest.java:
package com.itheima.day07.encapsulation;
import java.util.Scanner;
public class MovieTest {
public static void main(String[] args) {
Movie[] movies = new Movie[4];
movies[0] = new Movie(1,"水门桥", 38.9, 9.8, "徐克", "吴京", "12万人想看");
movies[1] = new Movie(2,"出拳吧", 38.9, 9.8, "唐晓白", "田雨", "3.5万人想看");
movies[2] = new Movie(3,"月球陨落", 38.9, 9.8, "罗兰", "贝瑞", "17.9万人想看");
movies[3] = new Movie(4,"一点就到家", 38.9, 9.8, "许宏宇", "刘昊然", "10.8万人想看");
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.println("请您输入操作指令:");
int command = sc.nextInt();
switch (command){
case 1:
operator.printAllMovie();
break;
case 2:
System.out.println("请输入您查询电影的id:");
int id = sc.nextInt();
operator.searchMovie(id);
break;
default:
System.out.println("您输入的指令不存在,请重新输入:");
}
}
}
}
运行结果:
补充知识:成员变量、局部变量的区别
总结
以上就是今天要讲的内容,本章知识点有面向对象简单的介绍,对象在计算机中的执行原理,类和对象的一些注意事项,还有this的使用场景与方法,构造器,封装,实体类JavaBean,综合示例-模仿电影信息系统,以及最后的补充知识:成员变量、局部变量的区别。
下一章:Java入门基础-08常用API