在Java中,重载和覆盖可以同时作为静态多态和动态多态吗?

3

这种类型的问题已经有答案了,但是它让我感到困惑。在查看大量答案之后,希望您在将其复制之前先查看我的问题。

情况1 -

静态多态性 - 函数重载 动态多态性 - 函数覆盖

链接 - https://dev59.com/VGcs5IYBdhLWcg3wYzBU#12894211 https://dev59.com/g2Ii5IYBdhLWcg3w9wQU#20783390 还有很多其他的链接。

我的困惑在于,在所有的例子中,都是使用向上转型来展示动态多态性。如果我不进行向上转型会怎样呢?

class A{
   public void show(){
       System.out.print("A");
   }
}

class B extends A{
   public void show(){
        System.out.print("B");
   }

   public static void main(String[] s){
      A a = new B();
      a.show(); // upcasting. It is dynamic polymorphism.
      B b = new B();
      b.show(); // Now java compiler can decide so is it still dynamic polymorphism?
   }
}

第二种情况 -

静态多态是通过重载实现的,如果方法是私有的、静态的或者final的话。

那么对于公共方法和默认方法的重载呢?


静态成员不参与运行时多态。您不能在派生类中重写静态成员,但可以重新定义它们。 - OPK
但是你可以重载静态方法,而且我说过,重载静态方法是静态多态的一个例子。我的问题是关于public和default怎么处理。 - Ishan
3个回答

1

静态方法只能被重载。

非静态方法既可以被重写,也可以被重载。

public/protected/private对此没有直接影响,除了因为private方法不能从子类中看到,所以它们也不能被重写。具体规则在这里定义。

如果你想要防止非静态方法被重写,你可以将其声明为final。(private方法因此隐式地成为了final。)


0

Q1 向上转型:将子类对象视为父类对象并对其进行处理是多态的本质。所以你的问题是:“如果我不进行向上转型呢?”那么你就没有使用多态。

Q2 静态多态 - 方法重写:它的意思是:

  • 静态:静态方法是可重写的,因为它们与类而不是对象相关联。例如,如果你有一个带有主方法的类,然后你派生出一个子类,并在子类中添加一个主方法,当你在子类中执行主方法时,它会被静态地覆盖

    • 私有:私有方法不会被继承,也不能在子类中调用,除非它们被静态地覆盖

    • 最终:最终方法是不可重写的。因此,在子类中重新定义它们会创建一个静态覆盖的方法


我完全同意你在Q1上的观点,但是如果我不进行向上转型,它会是动态绑定还是静态绑定呢? - Ishan
关于 Q2,我想问一下,我们能否通过方法重载(而不是覆盖)实现动态多态性? - Ishan

0

情况1
在编译时,编译器将识别与之匹配的方法签名,即在您的示例中没有参数的show()。无论调用的是A还是B的方法,在运行时仍然是确定的,尽管在您的示例中您确定它是B

情况2
我认为方法的可见性规则可能会让您感到困惑。

在运行时调用哪个重载方法的决定将在编译时决定,即重载方法是静态决定的 - 这与其是否为公共、包私有(默认)或私有无关。如果方法调用所在的对象没有该方法的可见性,则在编译时失败。

正如其他人所说 - 覆盖不适用于静态方法,因为它是类的一部分而不是实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接