代码语言
知识点思维导图
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→Integer、long→Long、double→Double、boolean→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 课细讲)
学完自测
选择所有正确答案;提交后逐项核对判断依据。