🏠 面向对象基础
类与对象 · 属性与方法 · 构造器 · this · 封装——Java 的核心思想从这里开始
1. 什么是"类"和"对象"?
🏠 类比——户型图 vs 房子:
类 = 户型图(设计图纸:有几间房、多大面积——只是"设计",不是实体)
对象 = 按图纸盖出来的房子(真实存在,可以住人)
一张户型图可以盖无数套房子(一个类可以 new 无数个对象),每套房子可以装修不同(每个对象属性值不同)。
类 = 户型图(设计图纸:有几间房、多大面积——只是"设计",不是实体)
对象 = 按图纸盖出来的房子(真实存在,可以住人)
一张户型图可以盖无数套房子(一个类可以 new 无数个对象),每套房子可以装修不同(每个对象属性值不同)。
类的组成:
- 属性(字段):这个类"有什么"(学生有姓名、年龄、学号)
- 方法:这个类"能做什么"(学生能学习、考试)
定义一个类 + 创建对象(完整示例)
// Student.java —— 定义"学生"这个类(户型图)
public class Student {
String name; // 属性:姓名
int age; // 属性:年龄
void study() { // 方法:学习
System.out.println(name + " 正在学习");
}
}
// Main.java —— 使用(盖房子)
public class Main {
public static void main(String[] args) {
Student s1 = new Student(); // new = 盖一套房子(创建对象)
s1.name = "小明"; // 给属性赋值
s1.age = 18;
s1.study(); // 调用对象的方法
Student s2 = new Student(); // 再盖一套(独立的对象)
s2.name = "小红";
}
}
小明 正在学习
🎯 核心认知
- 类 = 模板(设计),对象 = 实例(实体),new 关键字创建对象
- 对象之间互不影响:s1.name 和 s2.name 是两码事
- 访问:对象.属性、对象.方法(点号访问)
- String、数组、集合都是类——你一直在用对象,只是现在才明白
2. 什么是构造器(构造方法)?
构造器:创建对象时自动执行的特殊方法,用来"初始化"(给属性赋初始值)。特点:
- 方法名必须和类名一样,没有返回值类型(连 void 都不写)
- new 对象时自动调用(new Student() 就是在调用构造器)
- 没写构造器时,Java 自动给一个"无参构造器"
构造器示例
public class Student {
String name;
int age;
// 无参构造器(可以省略不写,Java 默认有)
Student() { }
// 有参构造器:创建时直接传值(推荐)
Student(String name, int age) {
this.name = name; // this 表示"当前这个对象"
this.age = age; // 区分"参数 age"和"属性 age"
}
}
// 使用:
Student s = new Student("小明", 18); // 一步到位,不用再手动赋值
🎯 注意
- this 关键字 = "当前对象自己"(参数和属性重名时必须有它)
- 写了有参构造器后,无参构造器不再自动提供——需要的话要自己写
- 构造器可以重载(多个版本,参数不同)
3. 什么是封装?private 和 getter/setter?
问题:直接 s.age = -100 怎么办?数据没校验就被写进去了。属性应该是"受保护的"。
封装:把属性设为 private(私有),外部不能直接访问,只能通过公共方法(getter/setter)操作——在方法里加校验。
标准封装写法(JavaBean 规范)
public class Student {
private String name; // private:只有本类内部能访问
private int age;
// getter:读属性
public String getName() { return name; }
// setter:写属性(可以加校验!)
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄不合法");
}
this.age = age;
}
public int getAge() { return age; }
}
// 使用:
Student s = new Student();
s.setAge(18); // ✅ 走校验
// s.age = 18; ❌ 编译报错:age 是 private,访问不了
🎯 必记
- private = 私有(本类可见);public = 公开(谁都可见)——两个最常用访问修饰符
- 封装的好处:数据安全(校验)、可维护(改内部实现不影响外部)、隐藏细节
- IDEA 一键生成:右键 → Generate → Getter and Setter
4. 继承和多态先混个脸熟?
继承(extends):子类"是"父类的一种,自动拥有父类的属性和方法(除 private)。
多态:父类类型引用子类对象,调用同一方法表现出不同行为。
继承 + 多态预览
class Animal { void speak() { System.out.println("..."); } }
class Dog extends Animal {
@Override void speak() { System.out.println("汪汪"); } // 重写父类方法
}
class Cat extends Animal {
@Override void speak() { System.out.println("喵喵"); }
}
// 多态:父类引用,子类行为
Animal a = new Dog();
a.speak(); // 汪汪
a = new Cat();
a.speak(); // 喵喵
这节先"混脸熟",深入理解去 java-basics 模块的面向对象页。
✍️ 练习题
- 1. 定义一个"手机"类:属性(品牌、价格),方法(call、playMusic),创建两个手机对象
- 2. 给手机类写有参构造器 + getter/setter(价格 setter 里校验 ≥ 0)
- 3. 定义一个"银行账户"类:余额私有,提供 deposit(存钱)/withdraw(取钱,余额不足报错)/getBalance
- 4. 思考:为什么 Java 程序都要从"类"开始写?(因为 Java 是面向对象语言,代码必须写在类里;但 Java 保留了 8 种基本类型和静态成员,并不是"纯"面向对象(Smalltalk / Ruby 才是))