在不实例化其类的情况下调用公共“非静态”变量或方法

时间:2013-10-30 08:11:54

标签: java non-static

有没有办法调用公共非静态变量或方法而不实例化其类java ...

6 个答案:

答案 0 :(得分:9)

在Java中,没有办法调用非静态变量,即没有instance的实例成员。

有一个原因,来自Understanding Instance and Class Members

  

当从同一个类蓝图创建多个对象时,它们每个都有自己不同的实例变量副本。

静态方法属于Class而不属于特定instance

答案 1 :(得分:2)

不,因为它违背了静态的目的

答案 2 :(得分:2)

不,没有实例调用实例变量是没有意义的。

答案 3 :(得分:1)

不是那不可能,你不能在没有创建实例的情况下调用非静态方法。但是如果你不想创建实例并希望直接调用那么将这些方法设为静态

答案 4 :(得分:1)

您需要一个对象来调用非静态方法,但它不必是定义方法的类的对象 - 它也可以是该类的子类的对象。

如果很难将手放在该类的对象上,这可能很有用 - 例如,如果它的构造函数具有难以获取且无法填充的参数,或者您需要从中创建对象另一个难以获得的对象中的方法。在这些情况下,您可以使用自己的类扩展该类,该类具有更容易的构造函数,创建该子类的对象并自己调用它。

请记住,这种方法是黑客和危险的,并且违反了OOP的核心原则。你的子类跳过它扩展的类的常规构造,因为那个构造太复杂了(如果不是你只是直接实例化它),你可以相当确定原始构造过程很重要,而且有些 - 如果不是大多数 - 该对象的功能将无法正常工作:如果幸运,抛出异常,如果你不太幸运,它可能会产生不良结果甚至损坏其他对象。即使你需要使用这种方法正确运行一种方法,未​​来对该类的更改也可能会使该方法依赖于正确的构造,这将破坏您的代码。

所以 - 使用风险自负!

public class MyNewClass extends ClassWithNonStaticMethod{
    public MyNewClass(){
        //Not doing proper construction
    }
}

//somewhere in your code:
new MyNewClass().nonStaticMethod();

答案 5 :(得分:1)

要回答你的问题,不,你不能。 Java不是为了让你这么做而设计的。

但是,我认为更重要的是要问:为什么你认为你需要这样做?

如果你无法控制这个类(即它的库类),并且你觉得有必要这样做,你可能错误地使用了库。

如果您可以修改该类,请将其设置为静态。