-->

非静态构造函数中的静态方法访问?(Static method access to non-stati

2019-07-29 07:55发布

我昨天考试了Java的。 有这似乎真是暧昧我的东西。

规则很简单:

  1. 静态方法不能不能调用非静态方法。
  2. 构造函数是一种没有返回类型的方法

     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的上述规则相冲突?

Answer 1:

1 - 静态方法不能不能调用非静态方法。

当然他们可以,但他们需要一个对象调用的方法

在一个静态方法,有没有this参考可用,所以foo()这相当于this.foo()是非法的。

2 - 构造函数是一种没有返回类型的方法。

如果他们要的方法相比 ,我要说的构造更接近非静态方法 (因为的确有this构造函数中引用)。

鉴于这种观点,应该很清楚你为什么静态方法可以调用构造函数没有任何问题。


所以,总结一下:

Main p = new Main();

没关系,因为new Main()不依赖于任何现有的对象上。

k();

是不行的,因为它相当于this.k()this是不是可以在你的(静态)主要方法。



Answer 2:

规则很简单:
1 - 静态方法不能不能调用非静态方法。

这是不正确的。 静态方法可以调用一个非静态方法,只是通过的“目标”的参考。 例如,这是细在静态方法中:

Integer x = Integer.valueOf(10);
int y = x.intValue(); // Instance method!

真正的问题是“有没有this静态方法中引用”。

2 - 构造函数是一种没有返回类型的方法。

这不是一个真正有用的模型,是诚实的。 它更有意义(从查看来电者的角度)考虑构造与返回类型这是一样的声明类的静态方法,但即使这是不以任何方式一个完美的模型。

我建议你认为一个构造为不同类型的成员组成。 拥抱,而不是试图掩盖它们的构造函数和方法之间的差异。



Answer 3:

号构造函数是不是在这方面,普通的方法。 构造函数的整点是,好了,建设类的新实例。

因此,它可以在静态范围内调用了。 试想一下:如果你需要你的类的现有实例,以创建它的一个新的实例,您只需将永远无法过实例化。

一些澄清:

静态方法不能不能调用非静态方法。

不完全的。 您还可以从一个静态方法内的非静态方法,只需要范围之该类的特定对象。 即

p.k();

将您的代码示例中完美地工作上面。

呼叫

k();

将是一个实例(非静态)方法内的罚款。 这将是等同于

this.k();

隐含this指的是类的当前实例。 每当编译器看到等的不合格的呼叫k()的实例方法中,它会自动将其与范围this. 。 然而,由于静态方法不依赖于任何类的实例,你(和编译器)不能引用this静态方法里面。 因此,你需要明确的名称,该类的实例来调用实例方法。



文章来源: Static method access to non-static constructor?