JAVA继承中变量和方法的存储和方法中访问变量的顺序
一、变量归属与内存位置
-
static 变量:属于类,只存在一份,保存在方法区(或元空间)。
-
实例变量(非static):属于对象,每个对象单独一份,保存在堆内存中。
二、非static方法中访问变量的查找顺序(非常重要)
在一个实例方法中写 x
,JVM 查找顺序如下:
1. 栈中局部变量(包括方法参数)是否有 x?
2. 如果没有,从 this 指向的对象中找:
- 先找子类对象自己的成员变量
- 若子类没有,再查父类继承来的变量
这种顺序遵循“就近原则”,是 JVM 局部变量解析的核心。
三、访问 static 变量的查找逻辑
-
编译期就确定了 static 变量的归属,不走对象、没有多态。
-
访问路径:
1. 先查当前类有没有定义这个 static 字段
2. 若没有,再往父类查
⚠️注意:虽然你可以通过对象来访问 static 字段,但实际解析还是走类的静态结构,写 s.species
实际是 Student.species
或 Person.species
,取决于定义在哪个类里。
四、背诵用总结口诀(极简记忆)
static 属类 → 方法区,实例属对象 → 堆内存
查变量顺序:局部 → this对象(子 → 父)
static 无多态,编译期解析类结构
访问 static,推荐类名.变量名
一、方法归属与内存位置
-
static 方法:属于类,只存在一份,保存在方法区(或元空间)。
-
实例方法(非static):属于对象,每个对象单独一份,保存在堆内存中。
二、方法类型分类:
private 方法、final 方法、static 方法、虚方法(普通实例方法)
三、继承与重写:
-
私有方法:不能被子类继承,无法重写。子类定义同名方法不算覆盖,只是新方法。
-
final 方法:可被继承,但不能重写。子类继承后行为固定,不可修改。
-
static 方法:不随实例继承;子类若定义同名 static 方法,只是隐藏(非重写);调用时根据声明类型静态绑定。
-
虚方法:指普通实例方法(非 private、非 final、非 static),支持继承和重写;调用时根据对象实际类型决定执行版本。
四、方法的调用规则(就近原则):
-
在实例方法中使用
this.方法()
调用,总是执行当前对象所属类的方法(若被子类重写,则调用子类版本)。 -
在实例方法中使用
super.方法()
调用,总是执行父类的方法版本(忽略子类的重写)。 -
在静态方法中不能使用
this
或super,可以直接用类名调用子类的静态方法或父类的静态方法
;在实例方法中调用静态方法时,虽然允许使用this调用子类静态方法和super
调用父类静态方法,但推荐直接使用类名或省略。
五、示例说明:
-
父类
A
定义了void foo()
,子类B
重写了foo()
:在B
的实例方法中调用this.foo()
会执行B
的实现,super.foo()
会执行A
的实现。 -
父类
A
定义了static void bar()
,子类B
定义了同名static void bar()
(隐藏,不是重写):在B
的实例方法中调用this.bar()
(或直接bar()
)会调用B.bar()
,super.bar()
会调用A.bar()
。
六、背诵用总结口诀(极简记忆)
私有不继承,final 不可改
static 隐藏按类定 → 无多态
虚方法随子覆 → 运行时看实态
this 调本类 → super 定父类