有关方法覆盖的问题

时间:2019-12-01 06:18:12

标签: java polymorphism overriding

我对Java中的方法重写感到困惑。

从定义上说:

  

在任何面向对象的编程语言中,覆盖都是一项功能   允许子类或子类提供特定的   一种方法的实现,该方法已经由其一个提供   超级类或父类。

现在,以下是与此有关的一个示例:

  class Parent { 
    void show() 
    { 
        System.out.println("Parent's show()"); 
    } 
} 
class Child extends Parent {  
    @Override
    void show() 
    { 
        System.out.println("Child's show()"); 
    } 
} 
class Main { 
    public static void main(String[] args) 
    { 
        Parent obj1 = new Parent(); 
        obj1.show(); 

        Parent obj2 = new Child(); 
        obj2.show(); 
    } 
} 

我对此行表示怀疑:

Parent obj2 = new Child(); 

我可以使用:

Child obj2 = new Child();  

那为什么我要用 Parent 类的名字来声明它?

目的是什么?

2 个答案:

答案 0 :(得分:2)

就像您说的那样,您不需要将子类对象声明为它们的父类,但是在其他情况下这可能很重要,例如,当您尝试使事物抽象化时。

什么是抽象?

除了最重要的部分,抽象正在删除所有内容。您可能已经使用了一吨的一个很好的例子是列表。

无论您使用的是ArrayListLinkedList还是任何其他类型的Java列表,您都知道可以始终依赖某些属性,例如获得列表,在特定位置获取特定元素,等等。

此DRAMATICALLY简化了它们的使用,您可以根据自己的应用程序互换它们。这是因为它们是List的子类,这些方法来自这些子类。

ArrayListLinkedList获取和设置数据的方式不同,但是从您的角度来看,这些子类的用户实现是相同的,您只需要使用被覆盖的类。这非常方便,因为您不需要了解编码方面的知识,可以尝试使用链表,数组列表尝试任何操作,然后更快地查看。

您在这方面扮演什么角色?

在您给出的示例中,它非常简单,并且没有关系,但是您说您正在制作一个类,该类以一种特殊,有趣且令人惊奇的方式对列表进行排序。

如果您将所有内容都声明为List,则该类的用户可以传入ArrayListLinkedList,这取决于他们在做什么,并且两者都可以工作。因此,要成为一名优秀的程序员,请尝试使所有内容尽可能抽象。早点学习是一个好规则。

答案 1 :(得分:1)

继承使我们可以重用代码,从而提高了Java应用程序的可重用性。 注意:继承的最大优点是,无需在子类中重写基类中已经存在的代码。