据我所知,在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。
我是编程世界的新手,因此可能会有一些我现在缺少的关键点,所以请不要投票我的问题没有价值,如果可能的话给我一些答案。
提前非常感谢..
答案 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()
的调用失败。