如何上传视频到公司网站,深圳专业做网站建网站价格,做电商的几个网站,厦门 做网站Java 中继承时#xff0c;成员变量的访问规则跟方法完全不同#xff0c;是初学者最容易混淆的地方之一。 核心一句话#xff1a; 成员变量访问遵循“就近原则 编译期静态绑定” #xff08;子类有同名变量 → 直接用子类的#xff1b;没有才用父类的#xff1b;this 和…Java 中继承时成员变量的访问规则跟方法完全不同是初学者最容易混淆的地方之一。核心一句话成员变量访问遵循“就近原则 编译期静态绑定”子类有同名变量 → 直接用子类的没有才用父类的this和super是强制指定访问范围的工具1. 成员变量 vs 方法 的本质区别最关键对比维度成员变量字段成员方法非静态同名时叫什么隐藏hiding重写overriding决定用哪个的时机编译期看引用类型运行期看实际对象类型多态下表现看左边引用类型看右边实际类型能否通过 super可以访问父类被隐藏的变量可以调用父类被重写的方法this.字段访问当前类声明的字段就近—super.字段强制访问直接父类声明的字段强制调用直接父类的方法2. 就近原则 this super 规则详解规则总结子类中访问成员变量时直接写变量名如age→ 找**当前类子类**有没有声明age→ 有 → 用子类的→ 没有 → 去父类找递归向上直到 Objectthis.age→ 强制找**当前类子类**有没有声明age→ 有 → 用子类的→ 没有 → 编译错误this 不会向上找super.age→ 强制找直接父类有没有声明age→ 有 → 用父类的→ 没有 → 继续向上找爷爷类super 也会向上递归直到找到或报错3. 经典代码示例强烈建议自己运行验证classFather{Stringname父亲;intage50;Stringhobby钓鱼;}classSonextendsFather{Stringname儿子;// 隐藏了父类的 nameintage20;// 隐藏了父类的 age// hobby 没有重新声明继承父类的voidprintAll(){System.out.println(直接写变量名);System.out.println(name);// 儿子就近 → 子类自己的System.out.println(age);// 20System.out.println(hobby);// 钓鱼子类没有 → 父类的System.out.println(\nthis. 强制当前类);System.out.println(this.name);// 儿子System.out.println(this.age);// 20// this.hobby // 编译错误当前类没声明 hobbythis 不向上找System.out.println(\nsuper. 强制直接父类);System.out.println(super.name);// 父亲System.out.println(super.age);// 50System.out.println(super.hobby);// 钓鱼}}publicclassTest{publicstaticvoidmain(String[]args){SonsnewSon();s.printAll();// 多态引用最容易错的地方FatherfnewSon();// 父类引用 → 子类对象System.out.println(\n多态下);System.out.println(f.name);// 父亲看引用类型 FatherSystem.out.println(f.age);// 50System.out.println(f.hobby);// 钓鱼// f 是 Father 类型所以它看到的都是 Father 声明的字段}}输出结果直接写变量名 儿子 20 钓鱼 this. 强制当前类 儿子 20 super. 强制直接父类 父亲 50 钓鱼 多态下 父亲 50 钓鱼4. 常见面试/易错点速查问题正确答案子类声明了同名变量父类的变量还能访问吗可以用super.变量名this.变量名一定访问子类的吗是的如果子类声明了否则编译错误this 不向上找多态下父引用.变量访问的是谁的父类的编译期看引用类型 → 静态绑定成员变量有方法重写那样的动态绑定吗没有成员变量永远是静态绑定编译期决定private 成员变量会被子类隐藏吗不会子类根本看不到 private 成员更谈不上隐藏static 成员变量呢也是静态绑定看引用类型但 static 变量不建议用继承方式访问5. 实际开发建议经验之谈尽量避免子类和父类出现同名成员变量非常容易制造 bug如果业务上必须同名优先用 getter/setter访问而不是直接访问字段想明确访问父类成员 →永远用 super.清晰、可读性高想访问当前类自己的 → 用this.尤其局部变量遮蔽成员变量时代码审查时看到大量super.xxx或同名字段 → 考虑是否设计有问题一句话记住方法看右边动态字段看左边静态就近原则只在直接写变量名时生效this 锁当前类super 锁直接父类有哪种特殊情况还想再验证比如多层继承爷爷-父亲-儿子同名变量怎么找static 变量 继承的访问规则接口中的 default 方法 字段Java 8内部类中 this 和 super 的特殊用法随时追问