【问题标题】:call non static method from static method in android从android中的静态方法调用非静态方法
【发布时间】:2013-11-20 07:08:10
【问题描述】:

我尝试从静态方法调用非静态方法但没有任何结果,我的应用程序运行崩溃 我的代码:

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中的静态方法可以调用非静态方法吗? 以及如何???

【问题讨论】:

  • 发布我们的崩溃错误日志!
  • 首先你不能为一个活动做new MainActivity()。我认为你的主要任务是展示 Toast。因此,将 Context 对象作为参数传递给 setAuth() 并使用该上下文对象显示您的 toast。
  • 在尝试制作 Android 应用程序之前,您应该考虑花更多时间在简单的 Java 编程上。
  • 代码不是来自我的应用程序,我尝试了简单的代码,如果代码有效,则更改我的应用程序

标签: java android static


【解决方案1】:

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

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();
    }

【讨论】:

    【解决方案2】:

    这样做的唯一方法是,如果您有权访问包含非静态方法的类的实例。

    编辑:我意识到这个答案听起来很空洞,没有进一步的解释,因为你做了一个新的MainActivity

    new MainActivity().d();

    无法在 Android 中使用,因为您无法以这种方式创建新 Activity。

    【讨论】:

    • 老实说,我会完全放弃这个设计。我会让 setAuth 接受 Context,并使用该上下文以该方法创建 Toast,将 d() 全部取消。如果你已经确定了你现在的设计,@NeilTownsend 提供了一个可靠的答案。
    【解决方案3】:
    public static void setAuth(MainActivity activity) {
           activity.d();
    }
    

    就这么简单。

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

    【讨论】:

    • 好的,尝试从onCreate方法中调用d()方法,去掉静态方法的调用。检查这是否是真正导致崩溃的原因。因为我不相信。
    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多