在没有实例的情况下,Android如何在一个类中调用非静态方法?

时间:2015-11-08 18:21:20

标签: java android

据我所知,在Android编程中,可以在没有实例的情况下在一个类中调用非静态方法。例如,

public class SampleActivity extends Activity {
    private Textview tvSample;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        findViews();
    }

    public void findViews() {
        tvSample = (TextView) findViewById(R.id.tvSample);
    }
}

所以问题是,findViews()方法在不声明变量的情况下工作,即使它是一个非静态方法。到目前为止,我已经知道在Java中,除非要将它与实例一起使用,否则应该声明一个静态方法。所以示例代码不起作用。

public class Sample {
    public static void main(String[] args) {
        int a = 4;
        printOnConsole(a);
    }

    public void printOnConsole(int a) {
        System.out.println(a);
    }
}

为了制作上面的代码,你应该在printOnConsole()方法中添加static。

我是编程世界的新手,因此可能会有一些我现在缺少的关键点,所以请不要投票我的问题没有价值,如果可能的话给我一些答案。

提前非常感谢..

2 个答案:

答案 0 :(得分:1)

  

findViews()方法在不声明变量的情况下工作,即使它是非静态方法

编译器将findViews()扩展为this.findViews(),因此存在“变量”。非静态方法只能在对象上调用(例如this)。

作为一般规则,请记住这一点:静态方法可以在对象上调用静态方法和非静态方法。非静态方法可以调用静态方法,对象的非静态方法以及声明它们的类及其超类的非静态方法。

为了证明这一点,用这些方法编译一个类:

public void oneNonStaticMethod() {
    otherNonStaticMethod();
}
public void otherNonStaticMethod() {
    // Nothing
}

oneNonStaticMethod将编译为:

0: aload_0           // Load "this" onto stack
1: invokevirtual #2  // Call otherNonStaticMethod:()V on "this"
4: return            // return

答案 1 :(得分:0)

在Android代码中,您在对象中,即SampleActivity

这就是找到方法findViews()的原因:只要活动开始,Android就会为您创建此对象。 Android中有很多东西在后台完成。你只需要填写缺失的部分即可。

在第二个示例中,您使用的是纯Java。您必须在main(String[] argv)函数内自己创建所有对象。由于您没有这样做,并且您不在对象内,因此对printOnConsole()的调用失败。