【Java】不同变量类型的线程安全、不同修饰符下的继承
变量类型对比(线程安全角度)
变量类型 | 存储位置 | 是否线程安全 | 原因说明 |
---|---|---|---|
局部变量 | 每个线程的栈中 | ✅ 安全 | 每个线程独立拥有自己的副本,互不干扰 |
类成员变量(实例变量) | 堆内存中,所有线程共享 | ❌ 不安全 | 多线程可能同时修改同一个对象的字段,需同步 |
静态变量 | 方法区/堆(全局共享) | ❌ 不安全 | 所有线程共享静态数据,需同步 |
static修饰下属性和方法的继承
项目 | 说明 |
---|---|
属性是否继承 | ✅ 会继承,但属于类本身,可以隐藏(hide),不是重写 |
方法是否继承 | ✅ 会继承,但不能重写,只能隐藏(同名遮蔽) |
是否支持多态 | ❌ 不支持多态。即使子类定义了同名 static 方法,调用时依然看变量类型而不是对象类型 |
调用推荐方式 | 使用 类名.方法() 或 类名.属性 调用,避免歧义 |
final修饰下属性和方法的继承
项目 | 说明 |
---|---|
属性是否继承 | ✅ 会继承,子类中可以访问,但不能修改(即不能再赋值) |
方法是否继承 | ✅ 会继承,但不能被子类重写(Override) |
是否支持多态 | ✅ 支持调用,但不能重写(所以不能动态绑定) |
关键用途 | 保证逻辑安全性,不允许子类修改方法实现(如 String.hashCode() ) |
private修饰下属性和方法的继承
项目 | 说明 |
---|---|
属性是否继承 | ❌ 不会被继承(子类中不能访问),但仍然存在于父类对象的内存中 |
方法是否继承 | ❌ 不会被继承,也不能重写 |
是否支持多态 | ❌ 不参与任何多态机制 |
子类同名定义 | ✅ 子类可以定义一个同名 private 方法或属性,是全新的,与父类无关 |