在Android中从静态方法调用非静态方法

3
我试图从静态方法中调用非静态方法,但是没有任何结果,我的应用程序崩溃了。 我的代码:
public class MainActivity extends Activity  {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        setAuth();
        ///

        ///



    }
    public static void setAuth() {

                new MainActivity().d();
        }
    public void d()
    {

        Toast.makeText(getApplicationContext(), "fff",Toast.LENGTH_SHORT).show();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }



    }

在 Android 中,可以从静态方法中调用非静态方法吗?如果可以的话,应该如何操作?

1
请发布我们的崩溃错误日志! - Rachita Nanda
首先,你不能对一个Activity使用new MainActivity()。我认为你的主要任务是显示Toast。因此,将Context对象作为参数传递给setAuth()并使用该Context对象显示Toast。 - Pankaj Kumar
1
在尝试制作Android应用之前,您应该考虑花更多时间学习简单的Java编程。 - Snicolas
代码不是来自我的应用程序,我尝试了简单的代码,如果代码可以工作,那么就更改我的应用程序。 - user3001104
3个回答

2

类中的静态方法必须能够在不引用类实例的情况下执行:

class MyClass {
    int information;
    static int usefulNumber = 72;

    int method() {
        return information;
    }

    static int methodStatic() {
        // Cannot refer to information
        // But can refer to usefulNumber
    }
}

根据定义,因此它不能执行类中的非静态方法,因为该方法不存在,除非像@RhinoFeeder所说,您已经实例化了该类并将其传递给静态类。
    static int methodStatic2(MyClass myClass) {
        return myClass.method();
    }

0
public static void setAuth(MainActivity activity) {
       activity.d();
}

很简单。

new MainActivity().d(); 调用另一个活动实例的方法。


好的,尝试从onCreate方法中调用d()方法并删除静态方法的调用,以检查是否真的是这导致了崩溃。因为我不相信它是这个原因。 - hasan

0
唯一能夠做到這一點的方法是,如果您可以訪問包含非靜態方法的類的實例。
編輯:我意識到這個答案聽起來很空洞,因為你 new-up 了一個 MainActivity。
在 Android 中無法使用 new MainActivity().d(); 的方式工作,因為您不能以這種方式創建新的 Activity。

1
说实话,我会完全放弃这个设计。我会让 setAuth 接收一个 Context,并在该方法中使用该上下文来创建 Toast,从而完全删除 d()。如果您坚持现有的设计,@NeilTownsend 提供了一个可靠的答案。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接