Java中PHP风格晚绑定的替代实现方案咨询
Java实现PHP晚绑定类似逻辑的方案
首先明确:Java中字段是静态绑定的,和PHP的属性覆盖逻辑不同。如果直接像PHP那样在子类定义和父类同名的字段,父类方法里访问的依然是父类自己的字段,不会用到子类的。但我们可以通过两种方式实现你要的效果:
方案一:通过方法重写实现动态绑定
Java的方法默认是动态绑定的(只要不是static、final、private修饰的),所以可以把字段的获取逻辑放到方法里,子类重写这个方法即可:
abstract class BaseClass { protected String getValueInternal() { return "Base"; } public String getValue() { return getValueInternal(); } } class ChildClass extends BaseClass { @Override protected String getValueInternal() { return "Child"; } } public class Main { public static void main(String[] args) { ChildClass obj = new ChildClass(); System.out.println(obj.getValue()); // 输出 "Child" } }
方案二:子类初始化父类字段
如果不想额外加方法,可以让子类在构造函数中给父类的字段赋值,避免重新定义同名字段(子类重新定义会隐藏父类字段,不是覆盖):
abstract class BaseClass { protected String value = "Base"; public String getValue() { return value; } } class ChildClass extends BaseClass { public ChildClass() { this.value = "Child"; // 直接修改继承自父类的value字段 } } public class Main { public static void main(String[] args) { ChildClass obj = new ChildClass(); System.out.println(obj.getValue()); // 输出 "Child" } }
为什么直接重写字段不行?
Java中子类定义和父类同名的字段,属于字段隐藏(Field Hiding),不是重写。此时父类的方法会访问父类自己的value字段,子类的value是完全独立的另一个字段,所以直接这么写的话,调用getValue()会输出"Base",达不到你要的效果。
内容的提问来源于stack exchange,提问作者stuck1a
相关产品推荐
相关产品推荐

