Java - 使用该类实例引用静态方法

时间:2011-05-25 06:44:42

标签: java static

使用该类实例的静态方法会发生什么? 在构建级别和运行时。

提前致谢。

更新: 有两个类,第一个类有一个方法,第二个类使用该方法,一段时间后该方法变为静态。在运行时,我得到IncompatibleClassChangeError。

3 个答案:

答案 0 :(得分:4)

如果从类实例调用静态方法,则与以标准静态方式(即从类名称)调用它相同。编译器足够聪明,可以知道进行静态调用。

答案 1 :(得分:0)

如果你的意思是

class Foo {
  static void bar() { ... }
}

public class Baz {
  public static void main(String... argv) {
    new Foo().bar();  // Use static method here via instance
  }
}

然后完全忽略了实例。

如果你是通过reflection进行的,那么它也会被忽略。

  

如果底层方法是静态的,则忽略指定的obj参数。它可能为空。

答案 2 :(得分:0)

考虑这种情况...

Class XYZ{

public static void functionTest(){
 // Your code
}

public static void main(String args[]){
XYZ x = new XYZ();
//Here we can execute the method functionTest() in 2 ways.
x.functionTest();
XYZ.functionTest();
}
}

每个类都会有一个名为类的上下文的东西,这意味着所有静态方法和静态变量都在RAM中分配内存,而不创建该类的对象,我们将该内存称为Context一堂课。

引用(x)包含两部分,一部分是对象(实例)的实际地址,另一部分是类的上下文地址。

当我们在上面的场景中调用x.function()时,首先它总是搜索类的上下文,如果它在那里找到它将执行它的方法,如果没有找到它将从类的实例执行它。

因此,无论以何种方式尝试执行静态方法,它都将始终从类的上下文执行,而不是从类的实例执行。

这就是为什么可以以两种方式调用类的静态成员的原因。

并且通过从实例调用方法,我们不必创建根本不需要的对象(不必要的内存分配)