我昨天考试了Java的。 有这似乎真是暧昧我的东西。
规则很简单:
- 静态方法不能不能调用非静态方法。
构造函数是一种没有返回类型的方法 。
public class Main { public static void main(String[] args) { Main p = new Main(); k(); } protected Main() { System.out.print("1234"); } protected void k() { } }
Main p = new Main() line prints 1234 k() line raises error
那么,为什么会出现这种情况? 没有它与Java的上述规则相冲突?
1 - 静态方法不能不能调用非静态方法。
当然他们可以,但他们需要一个对象调用的方法 。
在一个静态方法,有没有this
参考可用,所以foo()
这相当于this.foo()
是非法的。
2 - 构造函数是一种没有返回类型的方法。
如果他们要的方法相比 ,我要说的构造更接近非静态方法 (因为的确有this
构造函数中引用)。
鉴于这种观点,应该很清楚你为什么静态方法可以调用构造函数没有任何问题。
所以,总结一下:
Main p = new Main();
没关系,因为new Main()
不依赖于任何现有的对象上。
k();
是不行的,因为它相当于this.k()
和this
是不是可以在你的(静态)主要方法。
规则很简单:
1 - 静态方法不能不能调用非静态方法。
这是不正确的。 静态方法可以调用一个非静态方法,只是通过的“目标”的参考。 例如,这是细在静态方法中:
Integer x = Integer.valueOf(10);
int y = x.intValue(); // Instance method!
真正的问题是“有没有this
静态方法中引用”。
2 - 构造函数是一种没有返回类型的方法。
这不是一个真正有用的模型,是诚实的。 它更有意义(从查看来电者的角度)考虑构造与返回类型这是一样的声明类的静态方法,但即使这是不以任何方式一个完美的模型。
我建议你认为一个构造为不同类型的成员组成。 拥抱,而不是试图掩盖它们的构造函数和方法之间的差异。
号构造函数是不是在这方面,普通的方法。 构造函数的整点是,好了,建设类的新实例。
因此,它可以在静态范围内调用了。 试想一下:如果你需要你的类的现有实例,以创建它的一个新的实例,您只需将永远无法过实例化。
一些澄清:
静态方法不能不能调用非静态方法。
不完全的。 您还可以从一个静态方法内的非静态方法,只需要范围之该类的特定对象。 即
p.k();
将您的代码示例中完美地工作上面。
呼叫
k();
将是一个实例(非静态)方法内的罚款。 这将是等同于
this.k();
隐含this
指的是类的当前实例。 每当编译器看到等的不合格的呼叫k()
的实例方法中,它会自动将其与范围this.
。 然而,由于静态方法不依赖于任何类的实例,你(和编译器)不能引用this
静态方法里面。 因此,你需要明确的名称,该类的实例来调用实例方法。