当对象的引用是静态时,如何访问对象中的非静态方法?

xen*_*ite 0 java static

我有点麻烦这样在java中工作:

public class ClassA {
    public static ClassB PointerToB;
    public static ClassC PointerToC;

    public ClassA() {
        PointerToB = new ClassB();
        PointerToC = new ClassC();

        PointerToB.doSthB();
    }
}

public class ClassB {
    public void doSthB() {
        ClassA.PointerToC.doSthC();
    }
}

public class ClassC {
    public void doSthC() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

说我有这些课程,我的"主"班("A")有几个成员.这些指向其他对象("B","C")的指针是静态的,因此"B"中的代码可以访问"C"中的(非静态)方法.

我知道静态方法只能访问其他静态方法和/或变量,但由于对这些类的引用是静态的 - 而不是实际的类本身 - 它应该以这种方式工作 - 不应该吗?

我有点卡在这里,因为这种访问一直崩溃我的应用程序:(

我需要ClassB来访问ClassC中的(非静态)方法,而不传递对A或C的所有引用.我该怎么做呢?

Jon*_*eet 5

好了,比你的构造为其他ClassA变为畸形(你缺少括号),该代码编译 ......但要等到构建的一个实例ClassA,都PointerToBPointerToC将为空.如果您只想初始化它们一次,请在静态初始化程序中执行 - 例如使用声明:

public static ClassB PointerToB = new ClassB();
public static ClassC PointerToC = new ClassC();
Run Code Online (Sandbox Code Playgroud)

即便如此,这里有两个令人讨厌的设计(IMO):

  • 公共可变字段几乎总是一个错误
  • 如果所有内容都使用ClassA.PointerToB和ClassA.PointerToC,那么你就会有效地获得单例,并伴随着缺点.请考虑依赖注入.