在Java中,所有非静态方法都是“虚拟”的,这意味着它们基于基础对象的运行时类型,而不是指向该对象的引用的类型。因此,在对象的声明中使用哪种类型都没有关系,其行为将相同。
声明的影响是在编译时可见的方法。如果
SubClass具有的方法
SuperClass不(将其称为
subMethod()),则您将对象构造为
SuperClass s = new SubClass();
然后,您将只能在上调用可用的方法
SuperClass。也就是说,尝试调用
s.subMethod()会给您一个编译时错误。但是,正如您所发现的,如果中存在方法
SuperClass,但被
SubClass覆盖,则将执行该方法。
另一方面,静态方法不是虚拟的。运行下面的代码
public class StaticTest { public static void main(String[] args) { SuperClass s = new SubClass(); s.method(); // bad idea - calling static method via an object reference } public static class SuperClass { public static void method() { System.out.println("SuperMethod"); } } public static class SubClass extends SuperClass { public static void method() { System.out.println("SubMethod"); } }}
打印出“
SuperMethod”。但是,您应该很少在乎这些
static方法是非虚拟的,因为您永远都不能像我上面那样通过对象引用来调用它们。您应该通过类名称来调用它们:
SuperClass.method();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)