类和对象的概念
现实世界由无数个具体的个体组成,面向对象编程正是通过对这些个体进行归纳和抽象,提炼出”类”这一概念。
对象与类的关系
| 对象(具体、独一无二) | 类(抽象、归类) |
|---|
| 唐伯虎 | 人(Person) |
| 小强 | 蟑螂(Cockroach) |
| 旺财 | 狗(Dog) |
| 秋香 | 人(Person) |
| 霸王枪 | 武器(Weapon) |
class Person {}
class Cockroach {}
class Dog {}
class Weapon {}
Person tbh = new Person(); Code language: JavaScript (javascript)
核心定义
| 概念 | 说明 |
|---|
| 对象 | 现实世界中具体存在的个体,独一无二 |
| 类 | 对一组具有相同特征和行为的对象的抽象描述 |
你可以说”唐伯虎是人类”,但不能说”人类是唐伯虎”。类是抽象的模型,对象是模型塑造出的具体产物。
类的组成部分
| 组成部分 | 对应现实 | Java 中的体现 |
|---|
| 属性/特征 | 对象有什么 | 成员变量 |
| 行为/能力 | 对象能做什么 | 成员方法 |
class Person {
String name;
int age;
String gender;
void eat() {
System.out.println(name + "在吃饭");
}
void sleep() {
System.out.println(name + "在睡觉");
}
}Code language: JavaScript (javascript)
一个类可以创建多个对象
Person tbh = new Person();
tbh.name = "唐伯虎";
tbh.age = 25;
Person qx = new Person();
qx.name = "秋香";
qx.age = 22;Code language: JavaScript (javascript)
| 对比项 | 唐伯虎(tbh) | 秋香(qx) |
|---|
| 结构 | 相同(都有 name、age、gender) | 相同 |
| 数据 | name="唐伯虎", age=25 | name="秋香", age=22 |
同一个类创建的对象,结构相同,数据不同。
类与对象的关系总结
| 类比 | 类 | 对象 |
|---|
| 月饼模具 | 模具决定了月饼的形状和花纹 | 用模具压出的每一个具体月饼 |
| 建筑图纸 | 图纸规定了房屋的格局 | 按图纸建好的每一栋具体房屋 |
| 汽车设计图 | 设计图定义了车的参数 | 生产线上下来的每一辆具体车 |
创建对象的过程
Person p = new Person();Code language: JavaScript (javascript)
| 步骤 | 说明 |
|---|
Person p | 声明一个 Person 类型的引用变量 p |
new Person() | 在堆内存中创建 Person 对象,成员变量赋予默认值 |
= | 将对象地址赋值给引用变量 p |
注意事项
| 要点 | 说明 |
|---|
| 类是模板 | 类本身不占用对象的内存,只定义结构 |
| 对象是实体 | 每个 new 出来的对象在堆中独立存在 |
| 引用变量 | 栈中的引用变量存储的是对象在堆中的地址 |
| 空引用 | 引用变量为 null 时调用成员会抛 NullPointerException |