当前位置: 首页 > 面试题库 >

为什么我们说Java中的静态方法不是虚拟方法?

章锦
2023-03-14
问题内容

面向对象的范例中, 函数或虚方法是一种函数或方法,其行为可以在继承类内被具有相同签名的函数覆盖以提供 多态行为

根据定义,除 final和private方法 外,Java中的每个非静态方法默认都是 虚拟 方法 。无法为 多态
行为继承的方法 不是 虚拟方法。

Java中的抽象类不过是等同于C ++的纯虚方法。

为什么我们说Java中的静态方法不是虚拟方法?即使我们可以重写静态方法,因此它可以提供 多态性的
一些优点,并且Java中的静态方法也可以使用其关联的类名进行调用,但是也可以使用其关联类的对象来调用它。 Java 与调用实例方法的方式相同。


问题答案:

不能 覆盖静态方法。它们在编译时绑定。它们 不是
多态的。即使您尝试像实例方法一样调用它(也不应该使用IMO),它也绑定到该表达式的编译时类型,并且执行时值将被完全忽略(即使它为null)。 :

Thread otherThread = null;
otherThread.sleep(1000); // No errors, equivalent to Thread.sleep(1000);

对于读者来说,这种行为可能会非常混乱,这就是为什么至少 某些
IDE允许您生成警告或错误以“通过”引用访问静态成员的原因。这是Java设计中纯净和简单的缺陷-但是它根本无法使静态方法虚拟化。



 类似资料:
  • 问题内容: 我在这里阅读了一些有关静态方法的主题,我认为我理解滥用/过度使用静态方法可能导致的问题。但是我并没有真正理解为什么很难模拟静态方法的原因。 我知道其他模拟框架(例如PowerMock)可以做到这一点,但为什么Mockito不能? 问题答案: 我认为原因可能是模拟对象库通常通过在运行时动态创建类(使用cglib)来创建模拟。这意味着他们要么在运行时实现一个接口(如果我没有记错的话,这就是

  • 问题内容: 我已经在某些计算机科学测试中看到了下一段,希望我能在这里对它的含义有一个很好的解释,因为我用它搜索了一个小时,却找不到任何东西。 “当我们说Java语言具有 虚拟方法调用时 ,是指在Java应用程序中,执行的方法由运行时的对象类型决定” 这是什么意思?谁能更好地解释它? 问题答案: 这些行的作者使用的C ++术语。 更好的术语是动态绑定/动态调度。 这意味着,对象的动态类型是“选择”将

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则它可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 问题内容: Java main()方法的方法签名为: 此方法是否有理由是静态的? 问题答案: 该方法是静态的,因为否则会产生歧义:应调用哪个构造函数?特别是如果你的班级是这样的: JVM应该调用吗?它应该做什么x? 如果不是,JVM是否应该在不运行任何构造方法的情况下实例化?我认为不应该这样,因为这将对整个类进行特殊处理-有时你有一个尚未初始化的实例,并且必须在每个可以调用的方法中进行检查。 对于

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?

  • 我知道在Java中,静态方法和实例方法一样是继承的,不同的是,当它们被重新声明时,父实现是隐藏的,而不是重写的。好吧,这有道理。但是,Java教程指出 接口中的静态方法从不继承。 然而,