Java中属性无多态性,字段访问在编译期由引用类型决定;子类同名字段属隐藏而非重写;应使用private字段+重写getter方法实现多态效果。

不支持。Java 中属性(成员变量)没有多态性,只有方法有多态。
为什么属性访问不体现多态?
Java 在编译期就根据引用类型(左边类型)决定访问哪个字段,而不是运行时实际对象类型。也就是说:「编译看左边,运行也看左边」——和方法的「编译看左边,运行看右边」完全不同。
- 子类可以定义与父类同名的字段,但这叫
字段隐藏(field hiding),不是重写 - 父类引用访问字段时,永远拿到的是父类声明的字段值,哪怕实际对象是子类
- 这种行为容易引发误解,比如误以为
person.name会输出子类的name,结果却输出父类的
一个典型陷阱示例
class Person {
public String name = "Person";
}
class Student extends Person {
public String name = "Student";
}
public class Application {
public static void main(String[] args) {
Person p = new Student();
System.out.println(p.name); // 输出: "Person",不是 "Student"
}
}
这里 p 是 Person 类型引用,所以 p.name 永远取 Person.name;即使强制转成 Student:((Student)p).name,才得到子类字段值。
如何安全地获得“类似属性多态”的效果?
用 getter 方法代替直接访问字段——因为方法支持多态:
该系统采用多层模式开发,这个网站主要展示女装的经营,更易于网站的扩展和后期的维护,同时也根据常用的SQL注入手段做出相应的防御以提高网站的安全性,本网站实现了购物车,产品订单管理,产品展示,等等,后台实现了动态权限的管理,客户管理,订单管理以及商品管理等等,前台页面设计精致,后台便于操作等。实现了无限子类的添加,实现了动态权限的管理,支持一下一个人做的辛苦
立即学习“Java免费学习笔记(深入)”;
- 把字段设为
private - 在父类中定义
public String getName(),子类@Override它 - 通过
p.getName()调用,就能按实际对象类型返回对应值
这是 Java 多态实践中的基本守则:**所有需要多态行为的逻辑,必须封装在可重写的方法里,而非暴露字段。**
字段隐藏带来的歧义远大于便利,这也是为什么几乎所有规范(如《Effective Java》)都强调:优先使用 getter/setter,避免 public 字段。









