2010-04-16 25 views
14

其众所周知的事实是,静态方法只能在静态成员上工作。主要方法中的变量是静态的

public static void Main() 
{ 
    Test t1 = new Test(); 
} 

这里Main方法是静态的,但我还没有宣布t1为静态的。它是隐式静态的吗?

回答

23

不,这是一个本地变量。局部变量的行为方式与静态方法或实例方法中声明的方式相同。

作为非常粗糙指南(捕获的变量等介绍的并发症):

  • 实例变量:每个实例一个可变
  • 静态变量:针对类型本身
  • 局部变量一个变量(包括参数):每个方法调用的一个独立变量
+4

此答案已被接受。你只是还没有点击它:-D – 2010-04-16 09:20:36

10

它是一个众所周知的事实,静态方法只能在静态成员上工作

这不是事实;这是虚假的。没有任何限制;静态方法可以完全访问它们类型的所有成员:

class C 
{ 
    private int x; 
    static C Factory() 
    { 
     C c = new C(); 
     c.x = 123; 
    } 
} 

工厂是静态方法;它有权访问C的任何实例的私有实例成员。

+0

@Eric:正如Jon所说,这是一个局部变量,它只会在C方法中有作用域。所以我仍然相信'静态方法只能在静态成员上工作'。你说什么。 – 2010-04-21 14:37:55

+0

@vaibhav:我给出了一个在非静态成员上工作的静态方法的合法示例。因此,静态方法不能只适用于静态成员。 – 2010-04-21 14:44:04

+0

@vaibhav:或许让Eric的观点完全显式化会有所帮助:'x'是'C'类型的实例成员,而这个实例成员在静态方法'Factory'中合法使用。 “c”是一个本地的事实与这一点无关(例如,它可能很容易被作为参数传递给该方法);重要的是,即使它不是一个静态成员,使用成员'x'也是完全有效的。如果没有提供实例,则不能使用实例成员,当然,如果这是您反对意见的真正含义。 – kvb 2010-04-21 15:52:41