Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 呼吁公众";“非静态”;不实例化其类的变量或方法_Java_Non Static - Fatal编程技术网

Java 呼吁公众";“非静态”;不实例化其类的变量或方法

Java 呼吁公众";“非静态”;不实例化其类的变量或方法,java,non-static,Java,Non Static,有没有办法调用公共非静态变量或方法而不实例化其类java…在java中,没有办法调用非静态变量,即没有实例的实例成员 这是有原因的,从 当从同一个类蓝图创建多个对象时,每个对象都有各自不同的实例变量副本 如果as静态方法属于类而不属于特定的实例这是不可能的,您不能在不创建实例的情况下调用非静态方法。但是如果您不想创建实例并想直接调用,则将这些方法设为静态否,因为它违背了静态的目的您需要一个对象来调用非静态方法,但它不必是定义该方法的类的对象-它也可以是该类的子类的对象 如果很难将手放在该类的对象

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

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

这是有原因的,从

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


如果as静态方法属于类而不属于特定的
实例

这是不可能的,您不能在不创建实例的情况下调用非静态方法。但是如果您不想创建实例并想直接调用,则将这些方法设为静态

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

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

如果很难将手放在该类的对象上,例如,如果该类的构造函数具有难以获取且不能为null的参数,或者如果需要从另一个对象中难以获取自身的方法创建该对象,则这可能非常有用。在这些情况下,您可以使用自己的类(具有更简单的构造函数)扩展该类,创建该子类的对象并自己调用它

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

因此-使用风险自负

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

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

不,在没有实例的情况下调用实例变量是没有意义的。

要回答您的问题,不,您不能。Java不是为让您这样做而设计的

然而,我认为更重要的是要问:你为什么觉得需要这样做?

如果您不能控制这个类(即,它是一个库类),并且您觉得有必要这样做,那么您可能是错误地使用了库


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

为什么不将该方法设置为静态。
将其添加到应答器中我正在使用上述代码从ClassWithNonStaticMethod访问getter(),但getter()返回null,我没有从ClassWithNonStaticMethod获取值ClassWithNonStaticMethod中有构造函数,执行一些设计我已经向ClassWithNonStaticMethod,ClassWithNonStaticMethod(){}添加了新的默认构造函数,因为MyNewClass()扩展了它,所以它提示我重写超级构造函数这正是我警告过你的——当你破解对象的构造时,它的构造不正确,方法可能无法返回正确的结果。这种攻击只在调用本来应该是静态的方法时有用。这里的情况显然不是这样——你没有办法做你想做的事,因为你想做的事毫无意义。getter用于查询对象的状态。如果没有对象,则没有可查询的状态。从某种意义上说,
null
是正确的结果-不存在的对象的属性是“无”。