这类问题已经得到了回答,但这让我很困惑。我花了很多时间经历了很多回答,所以请在复制之前先完成我的问题。
案例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 -
如果方法是私有的,静态的或最终的,静态多态通过重载来实现。
那么重载公共和默认方法呢?
答案 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(默认)还是私有。如果发生方法调用的对象没有在编译时失败的方法的可见性。
正如其他人所说的那样 - 覆盖不适用于静态方法,因为它是类的一部分而不是实例。