从静态上下文访问非静态方法

Posted

技术标签:

【中文标题】从静态上下文访问非静态方法【英文标题】:accessing non-static method from static context 【发布时间】:2011-11-03 12:55:32 【问题描述】:

我对此有点困惑,我浏览此处建议的答案并没有立即产生适合我的上下文的结果。

我的问题是基本的。假设我有一个类似这样的方法。

private int someFunction(int x, int y)
    return (x+y+5)
 

但我想从 main (public static void main(String args[]) )) 调用这个函数。我该怎么做呢?

如果有你认为在这种情况下对我有帮助的教程,我也会非常感激。

【问题讨论】:

【参考方案1】:

此函数不需要访问任何成员变量,因此您可以将方法声明为静态:

private static int someFunction(int x, int y) 
        ^^^^^^
    return (x+y+5)
 

这将允许您从main 调用它,使用someFunction(arg1, arg2)YourClass.someFunction(arg1, arg2)


如果该方法确实需要访问成员变量(和/或this 引用),则不能将该方法声明为静态。在这种情况下,您必须创建一个包含该方法的类的实例才能调用它:

new YourClass().someFunction(0, 1);

或(如果您以后需要重用该实例)

YourClass x = new YourClass();
x.sumFunction(0, 1);

【讨论】:

【参考方案2】:

您必须先创建实例。根据定义,不能从静态上下文访问实例方法(非静态方法)。

因此,例如,如果您的 MyApp 类包含 someFunction()main(String[] args),请在您的 main 方法中执行以下操作:

new MyApp().someFunction(1, 2);

【讨论】:

【参考方案3】:

基本上,您只能从对象[类的实例]而不是类本身调用非静态方法。

如果您有点困惑,请查看 Sun java 教程,了解对象和类之间的区别 - 这是一个非常重要的概念!

如果函数不引用任何局部变量,您可以将其设为静态函数,或者创建该类的实例以便能够在本地调用它。

【讨论】:

【参考方案4】:

由于您的方法someFunction 不是静态的,您将无法从静态上下文(即 main())调用此方法。 1.所以你可以做一些功能

static private someFunction () 

2.or 可以从 main() 创建一个对象并调用 someFunction 像:

A a = 新 A(); a.someFunction(4, 5);

【讨论】:

【参考方案5】:

你需要有一个特定方法所属的类的实例调用实例方法。

在你的情况下,

new MyClass().someFunction(5,6);

【讨论】:

以上是关于从静态上下文访问非静态方法的主要内容,如果未能解决你的问题,请参考以下文章

"无法从静态上下文中引用非静态变量,非静态方法"

无法从静态上下文引用非静态方法

无法从静态上下文中引用非静态方法 getSocketFactory [重复]

无法从静态上下文中引用非静态 变量 this

使用依赖属性解决“无法在静态上下文中访问非静态属性”的另一种方法

非静态变量 this 不能从 main 方法中的静态上下文中引用