当前位置: 首页 > 知识库问答 >
问题:

凌驾vs隐藏Java-迷茫

尹赞
2023-03-14

我搞不清在Java躲起来有什么不同。有谁能提供更多的细节说明这两者有何不同?我读了Java教程,但示例代码仍然让我感到困惑。

说得更清楚一点,我很理解压倒一切。我的问题是,我看不出隐藏有什么不同,除了一个是在实例级别,而另一个是在类级别。

看Java教程代码:

public class Animal {
    public static void testClassMethod() {
        System.out.println("Class" + " method in Animal.");
    }
    public void testInstanceMethod() {
        System.out.println("Instance " + " method in Animal.");
    }
}

然后我们有一个子类cat:

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The class method" + " in Cat.");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method" + " in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

然后他们说:

该程序的输出如下:

动物类方法。

CAT中的实例方法。

对我来说,直接从Animal类调用类方法TestClassMethod()会执行Animal类中的方法这一点非常明显,没有什么特别之处。然后,他们从mycat的引用调用TestInstanceMethod(),因此很明显,执行的方法就是cat实例中的方法。

在我看来,调用隐藏的行为就像重写一样,所以为什么要做这种区分呢?如果我使用上面的类运行此代码:

Cat.testClassMethod();

我将得到:cat中的class方法。但是如果我从Cat中删除TestClassMethod(),那么我将得到:Animal中的类方法。

这向我展示了在子类中编写一个具有与父类相同签名的静态方法几乎就是重写。

希望我能弄清楚我的困惑所在,有人能给我一些启示。事先非常感谢!

共有1个答案

杨乐意
2023-03-14

重写基本上支持后期绑定。因此,将在运行时决定调用哪个方法。它用于非静态方法。

隐藏是针对所有其他成员(静态方法、实例成员、静态成员)。它是建立在早期绑定的基础上的。更清楚的是,要调用或使用的方法或成员是在编译时决定的。

在您的示例中,第一个调用Animal.TestClassMethod()是对Static方法的调用,因此非常确定要调用哪个方法。

在第二个调用MyAnimal.TestInstanceMethod()中,您调用了一个非静态方法。这就是您所说的运行时多态性。直到运行时才决定要调用哪个方法。

有关进一步的说明,请阅读覆盖与隐藏。

 类似资料:
  • 问题内容: 在以下情况下: 学生“隐藏人的ID字段。 如果我们想在内存中表示以下内容: 约翰对象会为storint Person.ID及其自己拥有两个单独的存储位置吗? 问题答案: 正确。示例中的每个类都有其自己的int IDid字段。 您可以通过以下方式从子类中读取或分配值: 或在外部(当它们是公开的时):

  • 问题内容: 看完C#的隐藏功能后,我想知道Java的一些隐藏功能是什么? 问题答案: 几个月前,Double Brace Initialization让我惊讶,以前从未听说过它。 ThreadLocals通常并不广为人知,它是一种存储每个线程状态的方法。 由于JDK 1.5 Java除了锁以外,还具有非常好的实现和健壮的并发工具,因此它们位于java.util.concurrent中,并且一个特别

  • 我们想隐藏“有优惠券吗?添加一张…”在WooCommerce结账时,如果已添加优惠券或客户在结账页面上添加优惠券。 目前,我们在下面有此代码,当客户在购物车页面输入优惠券,然后导航到结帐页面时,此代码有效。在这种情况下,“拥有优惠券?添加一张…”消息不可见。如果购物车页面上未添加优惠券,则消息可见。 这很好用!但是,当客户在结账页面上添加优惠券时,它不起作用。 1.)我们收到消息“优惠券已添加”,

  • 问题:如果距离为空/null,我试图隐藏一个值。 我尝试了以下操作,但该值仍在显示: 和 什么是实现我所期待的正确方法。 以下是我在coldfusion中定义距离的方式: 当我做以下建议时: ng-show="e.distance===未定义" 当我执行其他建议时,例如ng hide=“e.distance”, 以下是提供商包含的内容:

  • 问题内容: 我正在使用桌面应用程序创建GUI。我使用此代码根据平台屏幕的分辨率设置的GUI大小。 问题是,当我运行该应用程序时,GUI覆盖了所有屏幕。Windows任务栏也隐藏在GUI的后面。 我希望无论任务栏的大小如何,任务栏在所有情况下都应该可见。我该如何实现? 问题答案: 关于什么 ?

  • 输入一个语句后按回车键,MATLAB自动在屏幕上显示结果,但如果该行命令是以";"结尾,则MATLAB仍会进行运算赋值,但不显示任何输出结果.这一点在生成复杂矩阵时特别有用.例如: A = magic(100);