Java如何创建返回指定类实例的方法并访问对应类成员变量
问题根因
你当前的实现无法达到预期的核心原因是:Java的静态成员不具备多态特性。静态变量是直接绑定到类本身的,和运行时的实例类型无关。即使getfruit()方法实际返回的是Apple实例,只要方法的返回值声明类型是Fruits,直接通过.abc访问时永远会读取Fruits类的静态变量,不会匹配子类的同名静态变量。
另外你写的参考实现存在基础语法错误:
- 类声明关键字是小写
class,不是大写Class - 方法定义需要加括号、声明返回值类型,
getfruit的正确写法是public static Fruits getfruit()
实现方案
推荐优先使用第一种方案,符合面向对象设计规范,维护成本最低。
方案1:使用实例成员+多态(推荐)
将静态变量改为普通实例成员,通过实例的多态特性自动匹配对应类的值。如果要遵循封装原则,更推荐用getter方法重写的方式,避免变量隐藏带来的意外问题:
// 父类Fruits public class Fruits { private String abc = "Fruits对应的值"; public String getAbc() { return abc; } // 如果要放到Utility类,把这个工厂方法挪到Utility类即可 public static Fruits getfruit(int config) { if (config == 3) { return new Apple(); } return new Fruits(); } } // 子类Apple public class Apple extends Fruits { private String abc = "Apple对应的值"; @Override public String getAbc() { return abc; } }
调用时直接写Utility.getfruit(你的配置值).getAbc(),就可以根据配置自动拿到对应类的abc值。
如果你不想写getter方法,也可以直接把abc声明为public实例变量,效果和上面一致,只是不符合JavaBean封装规范而已。
方案2:保留静态变量,通过Class对象读取
如果业务上必须保留两个类的静态abc变量,就不要返回类实例,直接在工厂方法中返回对应类的Class对象,通过反射读取静态字段值:
public class Utility { public static Class<? extends Fruits> getfruit(int config) { if (config == 3) { return Apple.class; } return Fruits.class; } }
调用示例:
try { Class<?> targetClz = Utility.getfruit(你的配置值); String abcValue = (String) targetClz.getField("abc").get(null); } catch (NoSuchFieldException | IllegalAccessException e) { // 处理异常逻辑 e.printStackTrace(); }
这种写法需要额外处理反射异常,代码侵入性更高,没有特殊需求不建议使用。
内容的提问来源于stack exchange,提问作者SSMorgan
相关产品推荐
相关产品推荐

