2015-11-08 27 views
-2

据我所知,在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()方法。

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

非常感谢你提前..

+2

你不明白的静态含义 - 非静态上下文。在你的第二个例子中,你不能像这样调用'printOnConsole(int a)',因为你试图从一个静态的上下文中调用一个实例方法(* non-static *)而不是一个类方法(* static *),它是不允许没有您打电话给它的实例。阅读[了解班级成员](https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html)以掌握主题。 –

+0

一般规则:静态方法可以调用对象的静态方法和非静态方法。非静态方法可以调用静态方法,对象的非静态方法以及它们声明的类的非静态方法及其超类。 –

+1

是什么让你觉得'findViews'被调用时没有一个实例?它从不同的实例方法调用。 –

回答

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 
0

在Android的代码,你是对象,即SampleActivity内。

这就是为什么找到方法findViews():Android在每次活动启动时为您创建此对象。 Android中的许多事情都是在后台完成的。可以这么说,你只需要填写缺失的部分。

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

相关问题