属性隐藏针对变量、不支持多态,方法重写针对实例方法、支持多态;父类引用访问变量取父类定义值,调用方法执行子类重写逻辑;变量各自独立存储,方法则被替换实现。

属性隐藏和方法重写是 Java 继承中两个容易混淆但本质不同的机制:前者针对成员变量,后者针对实例方法;关键区别在于是否支持多态——变量不支持,方法支持。
看行为表现:父类引用调用时结果不同
当用父类类型引用指向子类对象(如 Parent p = new Child();)时:
- 访问同名变量(如 p.x)→ 实际取的是 Parent 类定义的 x,与真实对象类型无关
- 调用同名方法(如 p.show())→ 实际执行的是 Child 类重写的 show(),取决于真实对象类型
看内存与语法:变量共存,方法替换
子类中声明与父类同名的变量时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 父类的变量仍保留在子类对象中,只是被“遮住”了;可通过 super.x 显式访问
- 子类变量和父类变量各自占用独立内存空间,类型可以不同(比如父类 int x,子类 String x)
- 方法重写则完全不同:子类方法会替代父类方法的逻辑实现,签名必须一致,且不能用 @Override 注解修饰变量(编译报错)
看设计意图:为什么变量只能隐藏,不能重写
Java 不允许变量“重写”,是因为:
立即学习“Java免费学习笔记(深入)”;
- 如果子类能真正覆盖父类变量,那么父类中依赖该变量类型的方法(比如 int x; void calc() { return x * 2; })在子类中可能因类型变化而失效
- 隐藏机制保证了父类代码的稳定性——父类方法始终操作自己的字段,不受子类同名字段干扰
- 而方法重写是安全的,因为签名一致、行为可扩展,且编译器能校验访问权限、异常、返回类型等约束
看常见错误场景
容易踩坑的地方包括:
- 误以为 Child c = new Child(); System.out.println(c.x); 和 Parent p = new Child(); System.out.println(p.x); 输出相同——其实前者输出子类变量值,后者输出父类变量值
- 给静态变量或静态方法加 @Override ——编译失败,因为静态成员只能被隐藏,不能被重写
- 在构造器中调用被重写的方法(如父类构造器里调 add()),实际执行子类版本,但此时子类字段可能还未初始化(默认值参与运算)

















