代码语言

知识点思维导图

27 个知识节点

Java(05) - 类与对象

读完后,你应能完成以下任务:

  • 绘制“Java(05) - 类与对象 / 为什么 Java 一切都是"类"?”的关键对象与数据流,解释“Java 强制所有代码写在类里,没有游离的函数。”,并用源码位置、日志或 Trace 标注证据。
  • 为“Java(05) - 类与对象 / 类 vs 对象:图纸 vs 实物”设计正常与异常输入,验证“一张图纸可造无数实物,每个属性值不同,但结构和能力相同。”,输出首个偏差位置与回归测试结果。
  • 实现“Java(05) - 类与对象 / 类的三大组成”的最小代码或配置,检验“构造方法名必须和类名相同(不像 JS 用 constructor)”,输出命令、结果与 Diff,并说明不适用边界。

Java 面向对象核心。用第 4 课看过的 OrganizationController/OrganizationService 匿名化示例代码理解。

一、为什么 Java 一切都是"类"?

Java 强制所有代码写在类里,没有游离的函数。

// ❌ Java 不允许(JS 可以)
function getOrganization() { ... }

// ✅ Java 必须包在类里
public class OrganizationService {
    public OrganizationOut getOrganization(Integer id) { ... }
}
前端(JS) Java
函数可单独存在 函数(方法)必须在类里
面向对象可选 面向对象强制

二、类 vs 对象:图纸 vs 实物

类(Class)   = 图纸:定义"长什么样、能做什么"
对象(Object)= 实物:按图纸造出来的具体东西
// 类:定义"用户"长什么样(图纸)
public class User {
    String name;   // 属性
    int age;

    void greet() { // 方法
        System.out.println("我是 " + name);
    }
}

// 对象:按图纸造出具体的人(实物)
User tom = new User();   // new = 按图纸造一个
tom.name = "Tom";
tom.greet();             // 输出:我是 Tom

一张图纸可造无数实物,每个属性值不同,但结构和能力相同。

和 ES6 class 概念一样,只是 Java 语法更严格(要写类型、访问修饰符):

// 前端你见过的
class User {
    constructor(name) { this.name = name }
    greet() { console.log(this.name) }
}
const tom = new User("Tom")

三、类的三大组成

public class OrganizationService {
    // ① 成员变量(属性):这个类"持有"什么
    @Autowired
    private OrganizationMapper organizationMapper;

    // ② 构造方法:怎么"造"对象(没写则用默认)

    // ③ 成员方法(行为):这个类"能做"什么
    public OrganizationOut getOrganization(Integer id) { ... }
}

3.1 成员变量 = "有什么"

public class Organization {
    private Integer id;       // 网点 id
    private String name;      // 网点名称
    private Integer groupId;  // 所属集团
}

3.2 构造方法 = 怎么"造"对象

public class User {
    String name;

    // 构造方法:方法名 = 类名,无返回类型
    public User(String name) {
        this.name = name;  // this 指当前对象,和 JS 一样
    }
}
User tom = new User("Tom");

重点:

  • 构造方法名必须和类名相同(不像 JS 用 constructor)
  • 不写则自动有个空的默认构造方法
  • this 和前端含义一样

3.3 成员方法 = "能做什么"

定义在类里的函数:返回类型 方法名(参数) { }


四、static 静态:属于"图纸"而非"实物"

public class MathUtil {
    // 静态方法:属于类本身,不用 new
    public static int add(int a, int b) {
        return a + b;
    }

    // 普通方法:必须先 new 对象
    public int multiply(int a, int b) {
        return a * b;
    }
}

调用方式不同:

// 静态:直接 类名.方法()
int sum = MathUtil.add(1, 2);

// 普通:先 new 对象
MathUtil util = new MathUtil();
int product = util.multiply(3, 4);

类比前端:

Math.random()    // ≈ 静态方法,不用 new
new Array().push(1)  // ≈ 实例方法,要先 new

记忆:

  • static = 属于图纸,类名.方法 直接用
  • 不带 static = 属于实物,必须先 new

为什么 main 是 static? 程序启动时还没 new 任何对象,JVM 需要"不用造对象就能调"的入口。


五、串起来看 demo 匿名化示例代码

@RestController
@RequestMapping("/organization")
public class OrganizationController {        // ← 类(图纸)

    @Autowired
    private OrganizationService organizationService;  // ← 成员变量(持有 Service 对象)

    @GetMapping("/getById")
    public R<OrganizationOut> getOrganization(@RequestParam("id") int id) {  // ← 成员方法
        return R.ok(organizationService.getOrganization(id));
        //          ↑ organizationService 是对象,getOrganization 是它的成员方法
    }
}

细节:organizationService.getOrganization(id)对象.方法() 形式(非 static)。而这个对象不是你 new 的,是 @Autowired 让框架注入的。


六、补充:@Autowired 和 Integer(常见疑问)

6.1 @Autowired = 让框架帮你注入对象

@Autowired
private OrganizationService organizationService;  // 不 new,框架自动塞进来
  • 类比:你跟管家说"我要咖啡",管家端来,你不关心怎么做的
  • 好处:省事、单例复用、解耦
  • 专业名:依赖注入(DI),背后是 Spring IoC 容器(第 9 课细讲)

6.2 Integer vs int

int Integer
是什么 基本类型(纯数字) 包装类(对象)
能否 null ❌ 默认 0 ✅ 可以 null
int id = null;       // ❌ 编译报错
Integer id = null;   // ✅ 可以

需要表达"可能没值"时用 Integer(≈ TS 的 number | null)。

常见包装类:int→Integerlong→Longdouble→Doubleboolean→Boolean


七、本课小结

  • Java 一切代码都在里,面向对象是强制的
  • 类 = 图纸,对象 = 实物new 按图纸造实物
  • 类三大组成:成员变量(有什么)、构造方法(怎么造)、成员方法(能做什么)
  • static = 属于类本身,不用 new;不带 static = 属于对象,要先 new
  • @Autowired 让框架注入对象;Integer 是能为 null 的 int
  • 下一课:集合与泛型(List/Map,对比 JS 数组/对象)

八、总结

  • 为什么 Java 一切都是"类"?:| 函数可单独存在 | 函数(方法)必须在类里 |
  • 类 vs 对象:图纸 vs 实物:和 ES6 class 概念一样,只是 Java 语法更严格(要写类型、访问修饰符):
  • 类的三大组成:构造方法名必须和类名相同(不像 JS 用 constructor)
  • static 静态:属于"图纸"而非"实物":不带 static = 属于实物,必须先 new
  • 串起来看 demo 匿名化示例代码:细节:organizationService.getOrganization(id) 是 对象.方法() 形式(非 static)。
  • 补充:@Autowired 和 Integer(常见疑问):专业名:依赖注入(DI),背后是 Spring IoC 容器(第 9 课细讲)

学完自测

选择所有正确答案;提交后逐项核对判断依据。

1在“类与对象”中,需要同时满足“为什么 Java 一切都是"类"?”与“类 vs 对象:图纸 vs 实物”。给定正文约束“Java 强制所有代码写在类里,没有游离的函数。”,哪些判断保持了原有处理机制?多选
2“类与对象”出现偏差:“在“类与对象 / 构造方法 = 怎么"造"对象”中,即使不满足“构造方法名必须和类名相同(不像 JS 用 constructor)”,结果与副作用仍会保持不变。”已成为实际行为。围绕“构造方法 = 怎么"造"对象”与“成员方法 = "能做什么"”,哪些判断能定位被改变的职责或边界?多选
3评审“类与对象”方案时,验收条件包含“不带 static = 属于实物,必须先 new”。关于“static 静态:属于"图纸"而非"实物"”与“串起来看 demo 匿名化示例代码”的哪些决策符合正文机制?多选