-4

今天我正在帮助一位朋友完成他的 Java 作业,我想我没有意识到纯 Java 和 Android 中的 Java 之间存在差异。快速编写程序:

public class myClass{

    public static void Main (String[] args){
        doThis();
    }

    public void doThis(){
        System.out.println("Did this");
    }
}

但是在运行它时,我收到一个抱怨,我需要将 doThis() 方法设置为静态的。这是为什么?当我在 Android 中开发一些基本的东西时,我从来不需要使用 static 关键字。

注意:这可能源于我对静态的实际含义感到害怕。

4

4 回答 4

2

这是为什么?

因为Main()是静态的。

如果Main()是实例方法,并且您调用Main()myClass(例如,new myClass)的实例,那么doThis()也可能是实例方法。或者,如果您的静态Main()创建了 的实例myClass,它可以调用doThis()该实例。

当我在 Android 中开发一些基本的东西时,我从来不需要使用 static 关键字。

这是因为您在 Android 中的入口点往往是组件上onCreate()的实例方法(例如,Activity.

于 2012-12-17T21:41:47.367 回答
1

静态方法是不在任何 Object 实例上调用的方法。非静态方法属于一个对象,并且需要一个对象实例才能被调用。因此从静态方法调用实例方法是不合法的,因为静态方法不会在任何对象上调用。

您需要实例化一个对象来调用实例方法:

public static void main(String[] args){
    MyClass object = new MyCLass();
    object.doThis();
}
public void doThis(){
    System.out.println("Did this");
}

Android 代码是 Java 代码,并且具有完全相同的规则。

阅读有关实例和静态成员的 Java 教程

于 2012-12-17T21:43:14.653 回答
0

问题是你需要像这样重写它:

    public class MyClass{  //fixed camel casing, classes start with upper case
       public static void main (String[] args){  //fixed lettering
          MyClass mc = new MyClass();
          mc.doThis();
       }

    public void doThis(){
        System.out.println("Did this");
            }
    }

这对于Android和Java之间的区别并没有什么特别之处,两者都会失败。问题是您试图从静态上下文中引用非静态方法,这可能会导致问题,因为静态表示不需要实例化该类来调用函数。

于 2012-12-17T21:41:56.837 回答
0

可以在没有拥有类的实例的情况下调用静态方法,因此您可以这样做:

myClass.doThis();

由于您的 doThis() 方法不是静态的,因此您必须像这样创建一个实例对象:

myClass instance = new myClass();
instance.doThis();

调用 doThis() 方法的 main() 方法是静态方法,调用它不需要 myClass 的实例。这意味着您的主要方法调用的任何方法都必须是静态的,或者在实例对象上调用(参见上面的第二个示例)。

于 2012-12-17T21:49:05.537 回答