07-面向对象编程基础
1. 面向对象编程
1.1. 好处
更符合人的思维习惯,编程更直观。
1.2. 对象和类
1.2.1. 是什么
类是对象的模板。对象是类的实例。
- 对象是一种特殊的数据结构
- 对象是用类 new 创建。语法
类名 对象名 = new 类名();
//类的定义
public class 类名 {
//1.成员变量 描述类/对象 可以处理的数据
修饰符 数据类型 变量名;
//2.构造器
//3.成员方法 面熟类/对象 的功能
修饰符 返回值类型 方法名(参数列表){
//方法体
////局部变量:方法内定义的变量,没默认值,需要赋初始值()才能使用。
数据类型 变量名 = 初始值;
}
}
package com.juna;
public class Demo {
public static void main(String[] args) {
student s = new student(90);
boolean pass = s.pass(80);
System.out.println("pass = " + pass);
}
}
class student {
private double score;
public student() {}
public student(double score) {
this.score = score;
}
public boolean pass(double score) {
double diff;
diff = this.score - score;
System.out.println("diff = " + diff);
return this.score >= score;
}
}
- 类名首字母大写。
- 类中定义的变量,叫成员变量(对象的属性),成员变量有默认值,定义的时候不需要赋初始值。
- 类中定义的方法,叫成员方法(对象的行为)。
- 一个源代码文件,可写多个 class(类), 但只能有一个 class 被 public 修饰,且该类名必须和源代码文件名一致。
- 对象之间的数据互不影响。但是多个变量引用(指向)同一个对象,变量赋值会互相影响。
- 一个对象没有被任何变量引用,则该对象不能被操作,叫做垃圾对象。Java 有自动垃圾回收机制,会自动清除垃圾对象。
- 对象在堆内存中的存储了成员变量,以及类的地址。

1.2.2. 类中有哪些部分构成
- 成员变量
- 对象的
- 类的
- 最终的
- 常量
- 构造器
- 无参
- 有参
- 成员方法
- 对象的
- 类的
- 代码块
- 对象的
- 类的
Important
final 表示不能不修改,只能赋值一次
static 上下文(static 方法)不能用访问 static 字段/方法。static 代码块可以。
简单理解为:
静态的成员(静态方法、静态内部类)不能访问非静态的成员(非静变量、放态方法)。
类的访问对象的不可以,对象访问类的,可以。
1.2.3. 成员变量和局部变量的区别
| 区别 | 成员变量 | 局部变量 |
|---|---|---|
| 类中位置不同 | 类中,方法外 | 在方法、代码块、构造函数中定义的变量,包括参数 |
| 初始化值不同 | 有默认值, 不需要初始化赋值 | 没有默认值,使用之前必须完成赋值 |
| 内存位置不同 | 非静态的成员变量在堆内存 | 栈内存(Java 虚拟机栈(JVM Stack) 的 栈帧(Stack Frame)中的局部变量表) |
| 作用域不同 | 整个对象 | 在所归属的大括号中 |
| 生命周期不同 | 与对象共存亡 | 随着方法的调用而生,随着方法的运行结束而亡 |
Important
关于变量的默认值:记住局部变量没用默认值,其他的都有。
1.3. 思路
万物皆对象。
1.4. 对象的执行原理
例如:Student s = new Student();
- 每次
new Student()都会在堆内存开辟了一块内存区域,代表一个学生对象。 - 变量 s 保存的是学生对象的地址(变量 s 引用了学生对象,是引用数据类型)
1.5. 引用数据类型
一个变量保存的是对象的地址,那么这个变量是引用数据类型。
1.6. this
- this 是变量,存储的是调用它的对象的地址。
- 在方法中使用,表示当前对象。
- 用来解决对象的成员变量和对象方法内变量名称一样时,访问冲突的问题。
public class Student {
String name;
double score;
public void checkPass(double score) {
//score 是形参的值
//this.score 是成员变量 score 的值
return this.score >= score ? "pass" : "on pass";
}
}
方法里的 this 如何拿到调用它的对象?
- 编译器把含有 this 的方法加了 this 形参。对象调用这个方法的时候,JVM 会自动把对象的地址作为实参传入。
静态方法中为什么不能使用 this?
- this 是变量,存储的是调用它的对象的地址。
- 静态方法属于类本身,而不是某个对象。
- 静态方法通过类名调用
类名.静态方法名(实参)没有对象可以作为 this 参数传入,this 皆无确定,编译器会报错:Cannot use 'this' in a static context
| 方法类型 | 是否有 this? | 原因 |
|---|---|---|
| 实例方法 | 有 | 调用方法时有明确对象,this 指向它 |
| 静态方法 | 无 | 没有对象参与调用,JVM 无法传递 this |
1.7. 构造器
- 构造器是类中的方法,该方法名和类名相同,不能写返回值类型。修饰符是 public。
- 没有参数列,叫无参构造器。
- 有参数列表,叫有参构造器。
- 每次创建对象时,会立刻调用构造器,完成对成员变量的初始化(如果有成员的话)。例:
Student s = new Student
class student {
private double score;
public student() {}
public student(double score) {
this.score = score;
}
}
- 类设计的时候,不写构造器,Java 会自动为类生成一个无参构造器。
- 类设计的时候,写了有参构造器,Java 就不会在自动为类生成一个无参构造器。此时需要无参构造器,需要自己手写。
1.8. 封装
Java 中封装(Encapsulation)是面向对象编程(OOP)的四大基本特性之一,其核心思想是隐藏对象的内部实现细节,仅暴露必要的接口。封装提高了代码的安全性、可维护性和模块化程度。
1.8.1. 封装的定义(简洁版)
封装是将数据(成员变量)和操作数据的方法(成员方法)绑定在一起,并通过访问控制来隐藏对象的内部状态,从而保护对象的完整性和安全性。
1.8.2. 封装的实现方式(Java)
public class User {
// 私有属性(不允许直接访问)
private String name;
private int age;
// 提供公有的 Getter 和 Setter 方法供外部访问
public String getName() {
return name;
}
public void setName(String name) {
// 可以加入校验逻辑
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 0) {
this.age = age;
}
}
}
1.8.3. 关键点总结
| 点 | 说明 |
|---|---|
| 私有化成员变量 | 使用 private 修饰字段,禁止外部直接访问 |
| 提供公有访问方法 | 使用 public 的 getter/setter 控制访问 |
| 可添加校验逻辑 | 在 setter 中添加校验,提高安全性 |
| 增强灵活性 | 若内部实现变更,外部代码无需改动 |
1.8.4. 封装的好处
-
保护数据安全:防止非法访问和修改。
-
隐藏实现细节:调用者不关心内部逻辑。
-
易于维护和扩展:修改内部逻辑不会影响外部代码。
-
便于调试和日志记录:可集中处理访问逻辑。
1.9. JavaBean
是实体类,复合封装的定义,要求:
- 类中成员变量都要私有
- 对外提供 get/set 方法
- 类中必须有无参构造器
实体类的对象只负责数据存取,数据的处理交给其他类的对象完成,从而实现数据和业务处理分离。
2. Demo
模仿电影信息浏览系统
//展示所有电影信息
///根据id查电影信息