当使用该类实例使用静态方法时,会发生什么?在构建级别和运行时。
提前谢谢。
更新:有两个类,第一类有一个方法,第二类使用该方法,一段时间后该方法变为静态。在运行时,我得到了不兼容的ClassChangeError。
如果从类实例调用静态方法,它与以标准静态方式(即从类名)调用它完全相同。编译器足够聪明,知道如何进行静态调用。
如果你的意思是
class Foo {
static void bar() { ... }
}
public class Baz {
public static void main(String... argv) {
new Foo().bar(); // Use static method here via instance
}
}
则该实例被完全忽略。
如果你通过反射来完成,那么它也会被忽略。
如果基础方法是静态的,则忽略指定的obj参数。它可能为null。
考虑一下这个场景。。。
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();
}
}
每个类都会有一个名为Context的类,这意味着所有静态方法和静态变量都会在RAM中分配内存,而不创建该类的对象,我们将该内存称为类的Context。
引用(x)包含两部分,一部分是对象(实例)的实际地址,另一部分是类的上下文地址。
当我们在上面的场景中调用x.function()时,首先它总是搜索类的上下文,如果它在那里找到了方法,它将执行它,如果没有找到,它将从类的实例执行它。
因此,无论您尝试以何种方式执行静态方法,它都将始终从类的上下文执行,而不是从类的实例执行。
这就是为什么类的静态成员可以用两种方式调用的原因。
通过从实例中调用方法,我们不需要创建根本不需要的对象(不必要的内存分配)