对子类对象的超类引用显示与对子类对象的子类引用相同的行为

对子类对象的超类引用显示与对子类对象的子类引用相同的行为,第1张

子类对象的超类引用显示与对子类对象的子类引用相同的行为

在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();


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5489706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存