Java中不创建对象调用另一个类非静态get方法的解决办法
解决Java中不创建对象调用非静态get方法的方案
嘿,作为Java初学者碰到这个需求太正常了!毕竟非静态方法本来就和对象实例绑定,要访问私有字段又没法改成static,咱得找些变通的办法。结合你提到的有父类的场景,给你几个实用的方案:
方案1:让目标类提供预定义的静态单例实例
这是最常用且安全的方式——在目标类里定义一个静态的自身实例,你直接通过类名调用这个实例的get方法,不用自己手动new对象。比如:
// 父类 public class Parent { // 父类逻辑 } // 子类(目标类) public class Child extends Parent { private String privateField = "我是私有字段"; // 预定义的静态实例(单例) public static final Child DEFAULT_INSTANCE = new Child(); public String getPrivateField() { return privateField; } }
调用的时候直接用:
public class Test { public static void main(String[] args) { // 不用自己new,直接用类里的实例调用get方法 String value = Child.DEFAULT_INSTANCE.getPrivateField(); System.out.println(value); } }
这个方案既遵守了封装性,又满足了“不用自己创建对象”的需求,要是多线程场景,还可以把单例初始化改成线程安全的(比如双重校验锁)。
方案2:利用父类的静态方法返回子类实例
如果你的父类可以修改,可以在父类里定义一个静态方法,负责返回子类的实例,这样你通过父类的静态方法拿到实例后调用get方法,也不用自己手动new:
// 父类 public class Parent { // 静态方法返回子类实例 public static Child getChildInstance() { return new Child(); } } // 子类(目标类) public class Child extends Parent { private String privateField = "我是私有字段"; public String getPrivateField() { return privateField; } }
调用方式:
public class Test { public static void main(String[] args) { String value = Parent.getChildInstance().getPrivateField(); System.out.println(value); } }
这里底层虽然还是创建了对象,但你不用自己显式写new Child(),完全符合你“不创建对象”的直观需求。
方案3:反射创建实例(特殊场景用)
如果没法修改目标类和父类的代码,那可以用反射来创建实例并调用get方法——虽然还是创建了对象,但不用显式new,还能绕过一些访问限制(比如构造方法是私有的):
import java.lang.reflect.Constructor; public class Test { public static void main(String[] args) throws Exception { // 获取子类的构造方法 Constructor<Child> constructor = Child.class.getDeclaredConstructor(); constructor.setAccessible(true); // 如果构造方法是私有的,解除访问限制 // 创建实例 Child instance = constructor.newInstance(); // 调用get方法 String value = instance.getPrivateField(); System.out.println(value); } }
不过得提醒你:反射会降低代码可读性和性能,还破坏了封装性,非必要情况不建议用。
关键提醒
要记住:非静态方法和非静态字段本质上都属于对象实例,完全不创建对象就访问它们是不可能的——这是Java语言机制的设计逻辑。你说的“不创建对象”其实是指“不用自己手动显式创建对象”,上面的方案都是围绕这个核心需求来解决的。
内容的提问来源于stack exchange,提问作者Yani
相关产品推荐
相关产品推荐

