使用该类实例的静态方法会发生什么? 在构建级别和运行时。
提前致谢。
更新: 有两个类,第一个类有一个方法,第二个类使用该方法,一段时间后该方法变为静态。在运行时,我得到IncompatibleClassChangeError。
答案 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()时,首先它总是搜索类的上下文,如果它在那里找到它将执行它的方法,如果没有找到它将从类的实例执行它。
因此,无论以何种方式尝试执行静态方法,它都将始终从类的上下文执行,而不是从类的实例执行。
这就是为什么可以以两种方式调用类的静态成员的原因。
并且通过从实例调用方法,我们不必创建根本不需要的对象(不必要的内存分配)