静态方法访问非静态构造函数?

时间:2012-05-09 09:46:36

标签: java static constructor ambiguous

昨天我参加了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
    
  3. 那么为什么会这样呢?它不与上面的Java规则冲突吗?

3 个答案:

答案 0 :(得分:12)

  

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

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

在静态方法中,没有this引用可用,因此foo()(相当于this.foo())是非法的。

  

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

如果它们应该是compared to methods,我会说构造函数更接近于非静态方法(因为构造函数中确实存在this引用)。

鉴于这种观点,你应该清楚为什么静态方法可以毫无问题地调用构造函数。


所以,总结一下:

Main p = new Main();

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

k();

不合适,因为它等同于this.k(),{(1}}在您的(静态)主方法中不可用。

答案 1 :(得分:5)

没有。在这方面,构造函数不是普通的方法。构造函数的重点是构造一个新的类实例。

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

一些澄清:

  

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

不完全。您可以从静态方法中调用非静态方法,只需将范围范围内的方法调用到该类的特定对象即可。即。

p.k();

可以在上面的代码示例中完美运行。

电话

k();

在实例(非静态)方法中会很好。它等同于

this.k();

隐含的this指的是该类的当前实例。只要编译器在实例方法中看到像k()这样的非限定调用,它就会自动将其用this.作为范围。但是,由于静态方法不依赖于类的任何实例,因此您(和编译器)无法在静态方法中引用this。因此,您需要显式命名该类的实例以调用实例方法。

答案 2 :(得分:5)

  

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

这根本不是真的。静态方法可以通过“目标”引用来调用非静态方法。例如,这在静态方法中很好:

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

真实的点是“静态方法中没有this引用”。

  

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

说实话,这不是一个非常有用的模型。它使更多感觉(从调用者的角度来看)将构造函数视为一个静态方法,其返回类型与声明类相同,但即使这样也不是一个完美的模型。

我建议您将构造函数视为不同类型的成员。接受构造函数和方法之间的差异,而不是试图隐藏它们。