首页 > 解决方案 > 关于方法覆盖的问题

问题描述

我对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();  

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

它的目的是什么?

标签: javapolymorphismoverriding

解决方案


正如您所说,您不需要将子类对象声明为其父类,但在其他情况下这可能很重要,例如当您试图使事物抽象时。

什么是抽象?

抽象正在删除除最重要之外的所有内容。您可能已经使用了大量的一个非常好的示例是列表。

无论您使用的是ArrayList、 aLinkedList还是任何其他类型的 Java 列表,您都知道某些属性是您始终可以信赖的,例如获取列表的大小、在某个点获取某个元素等.

这极大地简化了这些的使用,您可以根据您的应用程序互换它们。这都是因为它们是 的子类List,这些方法来自其中。

anArrayList和 a LinkedListget 和 set 数据的方式不同,但从您(这些子类的用户)的角度来看,实现是相同的,您只需使用被覆盖的类。它非常方便,因为您不需要了解任何关于编码的知识,尝试使用链表进行的任何操作,然后使用数组列表,看看有什么更快。

你在其中有什么作用?

在您给出的示例中,它非常简单,并且没关系,但是假设您正在创建一个以特定,有趣,惊人的方式对列表进行排序的类。

如果您将所有内容都声明为 a List,则您的类的用户可以传入ArrayLists 和LinkedLists,这取决于他们在做什么,并且两者都可以工作。因此,要成为一名优秀的程序员,请尽量保持一切抽象。尽早学习是一个很好的规则。


推荐阅读