java中的重载和覆盖可以是静态多态还是动态多态?

时间:2015-08-06 18:02:02

标签: java polymorphism

这类问题已经得到了回答,但这让我很困惑。我花了很多时间经历了很多回答,所以请在复制之前先完成我的问题。

案例1 -

静态多态 - 函数重载 动态多态 - 函数重写

链接 - https://stackoverflow.com/a/12894211/3181738 https://stackoverflow.com/a/20783390/3181738 和许多其他人。

我的困惑在于,在所有示例中,动态多态性都是使用upcasting显示的。如果我不上传,该怎么办?

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?
   }
}

案例2 -

如果方法是私有的,静态的或最终的,

静态多态通过重载来实现。

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

3 个答案:

答案 0 :(得分:1)

静态方法只能重载。

非静态方法可以被重写和重载。

<UserControl.Resources> <Style TargetType="Button"> <Setter Property="models:MouseMoveBehaviour.MouseMoveCommand" Value="{Binding MyCommand}"/> </Style> </UserControl.Resources> <Button/> 不会直接影响这一点,但由于无法从子类中看到public/protected/private方法,因此也无法覆盖它们。确切的规则定义为here

如果您想阻止覆盖非静态方法,可以声明它private。 (final方法因此隐含private。)

答案 1 :(得分:0)

Q1 upcasting:向上传播和处理子类对象就好像它是父类对象一样,是多态的本质。那么你的问题是,&#34;如果我不倾斜怎么办?&#34;那么你没有使用多态

Q2静态多态 - 方法重写:这就是它所说的:

  • static:静态方法是可覆盖的,因为它们与类相关联,而不是与对象相关联。因此,例如,如果你有一个带有main方法的类,然后你继承它,并将main方法添加到子类,当你在子类中执行main方法时,它是静态重写的

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

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

答案 2 :(得分:0)

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

案例2
我认为方法的可见性规则可能会给你带来一些困惑。

将在编译时决定将在运行时调用哪个重载方法,即。重载方法静态决定 - 无论是public,package-private(默认)还是私有。如果发生方法调用的对象没有在编译时失败的方法的可见性。

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