开发必须掌握
类、对象、属性、方法、构造方法和 this。后续 Spring Boot 项目中的 User、Task、DTO、Entity 都建立在这些概念上。
- 类和对象有什么区别?
- 构造方法有什么作用?
this表示什么?
昨天使用两组数组保存学生: String[] studentNames = new String[10]; int[] scores = new int[10]; 同一名学生的数据依靠相同下标关联: studentNames[0]:张三 scores[0]:85 这种方式可以运行,但存在问题:
- 姓名和成绩是分开的,容易出现下标对应错误。
- 如果增加年龄,还要增加一个数组。
- 每个方法都要传入很多数组。
- 无法直接表达“一个学生拥有姓名和成绩”。
类可以把属于同一个事物的数据和行为组织在一起。
类是什么
public class Student { String name; int score;
public void printInfo() { System.out.println("姓名:" + name + ",成绩:" + score); }}逐行理解:
public class Student定义一个名为 Student 的类。
String name;int score;定义学生具有的属性,也常称为成员变量或字段。
public void printInfo()定义学生对象能够执行的方法。 类是我们定义的一种数据类型,也可以理解为对象的设计说明: 类包括 属性(具有的属性也称为成员变量或字段) 和方法(对象能够执行的方法);
对象是什么 类只是定义,必须根据类创建具体对象: Student student1 = new Student(); 可以分成:
Student student1 new Student()变量类型 变量名 创建Student对象然后给这个对象的属性赋值:
student1.name = "张三";student1.score = 85;调用这个对象的方法:
student1.printInfo();输出:
姓名:张三,成绩:85再创建一个对象:
Student student2 = new Student();student2.name = "李四";student2.score = 90;student1 和 student2 来自同一个类,但代表两个相互独立的学生。
实际后端用途 以后接收注册请求时,JSON数据可能会转换为一个对象:
姓名、密码、邮箱 ↓ User对象 ↓Service处理 ↓保存到数据库
`new Student()` 创建的是对象,不是再次创建一个类。类只需要定义一次,可以根据它创建很多对象。`student1.name` 中的 `student1` 和 `name` 分别是什么?`student1` 是 `Student` 类的一个实例。更准确地说:- `student1` 是引用变量的名字。- 它保存了一个 `Student` 对象的引用。- `student1.name` 表示访问该对象的 `name` 属性。`src` 源代码目录 默认包
类=属性+方法public class name{属性: int score;方法 public void printInfo() { System.out.print(""); } }对象由类创建name name1=new name();
public boolean isPassed() { boolean passed =false; // 布尔命名优化 // boolean isFirstStudentPassed = firstStudent.isPassed(); if (score >= 60) { passed = true; } return passed; //简化为return score >= 60; }## 模块二:构造方法放在属性之后、其他方法之前:构造方法负责在创建对象时完成初始化:为什么添加有参数构造方法后,`new Student()` 会报错?定义了构造方法后,Java不再自动赠送默认的无参数构造方法。public Student(String name, int score) { this.name = name; this.score = score; } 构造方法特点:
- 方法名必须与类名相同。
- 没有返回类型,连
void都不能写。 - 执行
new Student(...)时自动调用。 - 通常用于设置对象的初始状态。 创建对象可以改成: Student firstStudent = new Student(“张三”, 85); Student secondStudent = new Student(“李四”, 55);
this 是什么
构造方法中同时出现两个 name:
this.name = name;
this.name:当前对象的属性。name:调用构造方法时传入的参数。
this.属性 区分成员变量与参数。
-
左侧
this.name:当前这个对象的name属性。 -
右侧
name:构造方法收到的参数。 Java项目通常让参数名和属性名相同: 但是两边都会优先表示参数,相当于把参数赋给参数自己,对象属性仍然没有得到正确赋值。
Student student = new Student(“王五”, 90); 进入构造方法时,请回答:
- 右侧参数
name的值是什么? this.name = name执行后,对象的name属性是什么?- 构造方法里的
this指向哪个对象?- 参数
name的值:"王五"
- 参数
-
执行后对象的
name属性:"王五" -
this:不是字符串“王五”,而是当前正在创建的整个Student对象。this → 整个学生对象 this.name → 这个对象的姓名属性 name → 构造方法收到的姓名参数 “王五” → 参数和属性中保存的字符串值
模块三:对象之间的关系
实际业务中,一个对象经常需要引用另一个对象。
其他对象可以作为莫一个对象的属性来应用
构造方法也可以接收对象
【开发必须掌握】对象可以作为属性、参数和返回值。
【面试表达】这种“一个对象拥有或关联另一个对象”的关系常被称为 has-a 关系。
【以后深入】一对一、一对多、多对多会在数据库和项目设计阶段学习。
模块四:对象数组
应用练习:对象数组统计
以前用平行数组保存学生:
String[] studentNames;
int[] scores;
现在可以直接创建学生对象数组:
Student[] students = new Student[3];
注意:这句话只创建了三个用于保存对象引用的位置,没有创建三个学生。刚创建时:
students[0] = null
students[1] = null
students[2] = null
还需要分别放入对象:
students[0] = new Student(“张三”, 85, javaClass);
或者使用数组初始化:
Student[] students = {
firstStudent,
secondStudent
};
遍历时,每个数组元素都是一个 Student 对象:
students[index].printInfo();
含义是:
取得下标index中的Student对象
→ 调用这个对象的printInfo方法
挑战题:返回最高分学生对象 之前的方法可以返回基本类型:
public static int calculateTotal(...) { return ...;}方法也可以返回一个对象:
public static Student findTopStudent(Student[] students) { // 返回一个Student对象}这里返回 Student 对象
实际后端开发中经常出现:
根据用户编号查询 → 返回User对象 根据任务编号查询 → 返回Task对象
Student topStudent=findTopStudent(students);
System.out.println(“最高分学生:”);
topStudent.printInfo();
}
public static Student findTopStudent(Student[] students) {
Student topStudent= students[0];
for(int index=0;index<students.length;index++) {
if(students[index].score>topStudent.score) {
topStudent=students[index];
}
}
return topStudent;
}
面1
Student student = new Student("张三", 85, javaClass); 中:
Student是什么?student是什么? ``` student
不是对象本身,而是一个引用变量,它保存了新建对象的引用。初学阶段说“student对象”可以交流,但面试时应更准确。- `new Student(...)` 做了什么? `new Student(...)` 创建的是 Student 对象。一个类可以创建多个对象 这些对象的属性是否必须相同?为什么?类是对一类事物共同属性和行为的定义,对象是根据类创建的具体实例。`Student` 是类型,`student` 是保存对象引用的变量,`new Student(...)` 创建对象、调用构造方法并返回对象引用。一个类可以创建多个对象,每个对象拥有各自的实例属性,因此属性值不必相同。面2- 为什么构造方法不能写 `void`? 构造方法不是普通方法。Java规定构造方法不能声明任何返回类型,连 `void` 都不能写。如果写了就变成普通方法了,就不是构造方法,也不会在new Student()时自动执行- 它在什么时候自动执行?构造方法会在使用 `new` 创建对象时自动执行。- `this.name` 和右侧的 `name` 分别表示什么?`this.name`:当前对象的成员属性。右侧 `name`:构造方法的参数,不是类的属性。- 如果写成 `name = name`,可能产生什么结果?不只是“不方便阅读”。由于参数 `name` 会遮住同名属性:name = name;两边都表示参数,相当于把参数赋值给自己。对象的 `name` 属性没有被修改,仍然是默认值:null
观察:Classroom javaClass = new Classroom(“Java一班”);
Student firstStudent = new Student(“张三”, 85, javaClass); Student secondStudent = new Student(“李四”, 55, javaClass);
javaClass.className = “Java二班”;
请回答:
1. 这里一共创建了几个 `Classroom` 对象? 创建了1个 `Classroom` 对象。
判断对象数量最直接的方法是数 `new`:Classroom javaClass = new Classroom(“Java一班”); // 一次new
两名学生只是保存了同一个对象的引用,并没有重新创建班级。