java中静态方法和实例字段之间的通信

时间:2011-01-03 12:05:55

标签: java oop static

“静态方法可能无法与实例字段通信,只能与静态字段通信”。我得阅读这个引用的行。当我在这个论坛中研究其他线程时,我发现我们可以在静态方法中使用实例字段,反之亦然。那么,这个引用意味着什么?这是真的吗?

6 个答案:

答案 0 :(得分:6)

您不能在静态方法中使用非静态(实例)字段。那是因为静态方法与实例无关。

static方法是每个类一个,而类可能有许多实例。那么如果你有2个实例,那么静态方法会看到哪一个?

让我们假设这是有效的:

class Foo {
   private int bar;

   public static int getBar() {
      return bar; // does not compile;
   }
}

然后:

Foo foo1 = new Foo();
foo1.bar = 1;
Foo foo2 = new Foo();
foo2.bar = 2;

Foo.getBar(); // what would this return. 1 or 2?

答案 1 :(得分:2)

class MyClass{
  int i ;
  static String res;
  public static void myMethod(){
      i = 10 //not allowed because it is instance non static field
      res = "hello" ; allowed , because it is static field
      new MyClass().i = 10;//allowed as we are accessing it using an instance of that class
  }


}

描述:静态字段/方法/ ..与类不与该类的对象相关联。其中成员变量/方法与类的对象相关联,因此要访问它们,我们需要类

的对象

另见

答案 2 :(得分:1)

您不能在静态方法中使用实例字段。您指的是哪个实例?

然而,静态方法可能具有对实例的引用,因此使用该实例上的字段。

e.g。

public class Stock {
  public double price = 0.0;

  public static void setPriceIncorrectly() {
     price = 0.0 // which price ?
  }

  public static void setPriceCorrectly() {
     Stock s = new Stock();
     s.price = 0.0 // which price ?
  }
}

答案 3 :(得分:1)

  

我发现我们可以使用实例   静态方法和恶习中的字段   反之亦然

事实并非如此;你不能在“静态”方法中引用实例字段,因为“静态”方法不属于“实例”。

推荐阅读:http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

答案 4 :(得分:0)

你不能使用不存在的东西。

当你有静态字段或方法与instace没有关联时。所以非静态元素不存在。

答案 5 :(得分:0)

您始终需要一个实例与实例字段进行通信。如果您有权访问实例(例如param或静态字段),则可以访问其成员。但是你无法直接访问该类的实例字段。