第12篇:Java对象、类、抽象类、构造方法

📌 系列导航《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第11篇:Java控制台输入输出语句|
➡️ 下一篇:第13篇:JDK和JRE、final与static、堆和栈

一、核心知识点

  • 类与对象的关系(蓝图 vs 实例)
  • 构造方法(构造函数)的作用、重载
  • 抽象类的定义与使用场景
  • this关键字:区分成员变量、调用其他构造方法
  • 封装与访问修饰符(privateprotectedpublic

二、通俗讲解(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
构造方法中调用可被子类重写的方法 子类未完全初始化,可能空指针 构造方法中只调用privatefinal方法
this()super()同时出现在一个构造方法中 编译错误 只能选其一,且必须在第一行

五、面试高频考点

Q1:构造方法能不能被继承?能不能被重写?

不能被继承,也不能被重写,但可以被重载。

Q2:抽象类能不能有构造方法?有什么用?

可以有。用于初始化抽象类的成员变量,被子类构造方法通过super()调用。

Q3:this关键字的三种用法?

  1. 区分成员变量和局部变量(this.name = name
  2. 调用本类的其他构造方法(this(参数)
  3. 返回当前对象(return this

六、练习题

  1. 设计:定义一个Book类,包含书名、作者、价格,提供至少两个构造方法,并实现printInfo()
  2. 抽象类:定义一个抽象类Vehicle,包含抽象方法run(),创建CarBike子类实现。
  3. 代码分析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!
👉 点击关注我,更新后第一时间收到推送!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐