You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:00:26