类
定义
类:对现实世界中事物的抽象。Student
对象:现实世界中具体的个体。张三、李四 这些具体的学生
面向对象的特征:抽象、封装、继承、多态
OOP: Object Oriented Programming 面向对象编程
类和对象的总结:
1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。
2、对象:真实存在的对象
3、类中包含:
1)所有对象所共有的特征–属性(静)
2)所有对象所共有的行为–方法(动)
4、类是对象的模板,对象是类的具体实例。
5、一个类可以创建多个对象, 同一个类的不同对象,结构相同,数据不同。
面向对象 vs 面向过程
面向过程
面向过程以过程为中心,强调的是一步步完成任务,是流水线式的思维。
比如:把大象装进冰箱
- 打开冰箱门
- 把大象赶进去
- 关上冰箱门
面向过程是:函数(方法)一步步调用,顺序执行。
面向对象
面向对象以对象为中心,强调的是找对象来完成任务。
同样:把大象装进冰箱
- 对象:冰箱、大象
- 冰箱有行为:开门、关门
- 大象有行为:走进来
- 交互:冰箱开门 → 大象走进 → 冰箱关门
面向对象是:对象有自己的属性和行为,对象之间交互完成任务。
对比总结:
| 面向过程 | 面向对象 |
|---|---|
| 以过程为中心,强调步骤 | 以对象为中心,强调交互 |
| 适合简单任务,功能单一 | 适合复杂任务,易于维护扩展 |
| 代码复用性差 | 代码复用性好 |
| 不容易应对需求变化 | 更容易应对需求变化 |
现实世界复杂,都是由多个对象组成,所以面向对象更符合现实世界的思维方式,适合开发大型软件。
对象、引用、栈和堆
初学者容易把“变量”和“对象”混在一起。Java 中对象通常创建在堆内存中,局部变量保存的是对象引用。
Person p1 = new Person("张三", 20);
Person p2 = p1;
p2.setName("李四");
System.out.println(p1.getName()); // 李四
上面代码中,p1 和 p2 是两个引用变量,但它们指向同一个对象,所以通过 p2 修改对象后,p1 看到的也是修改后的状态。
flowchart LR
subgraph 栈内存
p1[p1 引用]
p2[p2 引用]
end
subgraph 堆内存
obj[Person 对象
name=李四, age=20]
end
p1 --> obj
p2 --> obj
1. 堆:new出来对象放在堆里面
2. 栈:变量(引用)放在栈里面,存储的是对象的地址值
3. 方法区:存放加载的类的信息
封装
面向对象的封装是一种编程概念和原则,它通过将数据和操作封装在一个对象中,以实现信息隐藏和安全性。
封装使得对象的内部细节对外部不可见,只暴露必要的接口供其他对象进行交互。
Java 提供四个访问修饰符控制访问权限:
| 修饰符 | 本类 | 同包 | 不同包子类 | 任意位置 |
|---|---|---|---|---|
private |
✅ | ❌ | ❌ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
protected |
✅ | ✅ | ✅ | ❌ |
public |
✅ | ✅ | ✅ | ✅ |
- private:私有,只能在本类中访问
- default:包访问权限,只能在本包中访问
- protected:本包 + 不同包子类可以访问
- public:公开,任何地方都能访问
构造方法
构造方法是new对象时候调用方法,特点:
- 方法名和类名一样
- 没有返回值
- 在new对象的时候会调用构造方法
//无参构造方法
//如果不写,Java默认提供这样一个无参构造方法.
//如果你写了任何一个构造方法,Java就不会再提供这个无参构造方法
public Student() {
System.out.println("Student.Student()");
}
//有参构造方法
public Student(int id, String name, int age, String gender) {
this.id = id;//把1这个值赋值给当前new出来的student对象的id属性
this.name = name;
this.age = age;
this.gender = gender;
}
Student student = new Student(2, "李四", 24, "男");
System.out.println(student);
1. 如果不写任何构造方法,系统默认提供一个无参数构造方法,只是我们看不到而已。
2. 如果自己写了任何一个构造方法,不管有参没参,系统就不会提供这个默认无参构造方法。
3. 自己写了一个带参数的构造方法,就要把无参数构造方法也要写上。
4. new 对象 new的就是这个构造方法