《Java 100 天进阶之路》第12篇:Java对象、类、抽象类、构造方法
第12篇:Java对象、类、抽象类、构造方法
📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第11篇:Java控制台输入输出语句|
➡️ 下一篇:第13篇:JDK和JRE、final与static、堆和栈
一、核心知识点
- 类与对象的关系(蓝图 vs 实例)
- 构造方法(构造函数)的作用、重载
- 抽象类的定义与使用场景
this关键字:区分成员变量、调用其他构造方法- 封装与访问修饰符(
private、protected、public)
二、通俗讲解(1分钟开心学)
1. 类与对象
- 类:图纸。定义了一类事物共有的属性(变量)和行为(方法)。
- 对象:根据图纸造出来的具体实物。每个对象的属性值可以不同。
生活类比:
类就像一张“汽车设计图”,上面写着“有方向盘、四个轮子、能加速”。对象就是根据这张图纸造出来的一辆辆汽车,每辆车的颜色、车牌号可以不同。
2. 构造方法(构造函数)
构造方法是创建对象时自动调用的特殊方法,用来初始化对象的状态(给属性赋值)。
特点:
- 方法名与类名完全相同
- 没有返回值类型(连
void都不写) - 如果没有手动定义构造方法,编译器会自动生成一个无参构造
- 可以重载(多个构造方法,参数不同)
3. this关键字
- 区分成员变量和局部变量(当名称冲突时)
- 调用本类的其他构造方法:
this(参数)— 必须写在构造方法的第一行
4. 抽象类
- 用
abstract修饰的类叫抽象类 - 可以包含抽象方法(只有方法签名,没有方法体,用
abstract修饰) - 不能直接
new实例化,必须被子类继承后,由子类实现所有抽象方法才能实例化 - 也可以包含普通方法和属性
- 作用:定义模板,让子类填充具体实现
生活类比:
抽象类就像一张“水果沙拉食谱”,它描述了“需要切水果、加酸奶、搅拌”这些步骤,但“切什么水果、放多少酸奶”这些具体内容留给你自己决定。你不能直接吃“食谱”,必须照着它做出一份具体的沙拉。
三、实操代码案例 + 场景说明
场景:开发一个图形计算程序,需要表示圆形和矩形,它们都有“计算面积”的行为,但计算方式不同。
1. 类与构造方法示例
public class Person {
private String name;
private int age;
// 无参构造
public Person() {
this("匿名", 0); // 调用另一个构造方法
}
// 有参构造(重载)
public Person(String name, int age) {
this.name = name;
setAge(age); // 使用setter做校验
}
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
} else {
throw new IllegalArgumentException("年龄非法");
}
}
public void introduce() {
System.out.println("我是" + name + "," + age + "岁");
}
}
// 使用
Person p1 = new Person("张三", 25);
Person p2 = new Person(); // 使用无参构造,name="匿名", age=0
2. 抽象类示例
// 抽象类
abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
// 抽象方法:只有声明,没有实现
public abstract double area();
// 普通方法:子类可以直接继承使用
public void showColor() {
System.out.println("颜色:" + color);
}
}
// 子类实现
class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
// 使用
Circle c = new Circle("红色", 5.0);
c.showColor(); // 普通方法
System.out.println("面积:" + c.area()); // 抽象方法已实现
四、避坑要点
| 错误/误区 | 后果 | 正确做法 |
|---|---|---|
| 定义了有参构造,忘写无参构造 | 子类或某些框架(如Spring)报错 | 显式写出无参构造或使用@NoArgsConstructor |
| 抽象类的子类没有实现所有抽象方法 | 编译错误 | 要么实现所有抽象方法,要么子类也声明为abstract |
| 构造方法中调用可被子类重写的方法 | 子类未完全初始化,可能空指针 | 构造方法中只调用private或final方法 |
this()和super()同时出现在一个构造方法中 |
编译错误 | 只能选其一,且必须在第一行 |
五、面试高频考点
Q1:构造方法能不能被继承?能不能被重写?
不能被继承,也不能被重写,但可以被重载。
Q2:抽象类能不能有构造方法?有什么用?
可以有。用于初始化抽象类的成员变量,被子类构造方法通过
super()调用。
Q3:this关键字的三种用法?
- 区分成员变量和局部变量(
this.name = name)- 调用本类的其他构造方法(
this(参数))- 返回当前对象(
return this)
六、练习题
- 设计:定义一个
Book类,包含书名、作者、价格,提供至少两个构造方法,并实现printInfo()。 - 抽象类:定义一个抽象类
Vehicle,包含抽象方法run(),创建Car和Bike子类实现。 - 代码分析:
new Person().introduce();如果Person只有带参构造会怎样?如何修复?
📊 你的学习进度
- 当前:第12篇 / 共44篇 · 第二阶段:核心语法与面向对象(第5~20篇)
- ✅ 已完成:第1~11篇
- 📖 正在学:第12篇
- ⏳ 待学习:第13~44篇
👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇
💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!
👉 下一篇预告
《JDK和JRE、final与static、堆和栈》
内容简介:JDK⊃JRE⊃JVM三者关系,static变量/方法/代码块详解,堆与栈内存区别。
💡 学完这篇,你将彻底理解Java程序的运行环境和内存模型,面试必考内容一次搞定。
📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)