我们究竟在哪里隐藏Java中的实现细节(抽象)

时间:2018-06-13 11:59:30

标签: java class oop abstract-class abstraction

public abstract class abs {
    abstract void dance();
}

这个抽象类由Outer类扩展。

public class Outer extends abs {

    public static void main(String[] args)
    {
        Outer o = new Outer();
        o.dance();

    }

    @Override
    void dance() {

        System.out.println("dancing from abstract class");
    }

我没有在抽象类中指定dance()方法的任何实现细节,而是在dance()类中定义了Outer方法,即在派生类({{1}中显示实现细节})。我们将从Outer课程运行该程序。那么,我们究竟在哪里隐藏用户的实现细节?抽象在哪里实现?

2 个答案:

答案 0 :(得分:0)

隐藏在某种意义上,您可能会根据您所处的上下文在应用程序中使用抽象,并在需要时wire使用具体类。

关键的想法是,一个对象可以做某事很重要,它是如何做到的并不是必不可少的重要。使用抽象的直接后果是,您可以轻松地更改实现under the hood,而不会产生任何副作用。

例如,考虑语言的sort操作。当您使用on collection调用sort时。一般来说,你想要的只是对集合进行排序,关于它是如何完成的并不总是重要的。

答案 1 :(得分:0)

在此处的具体情况中,没有任何内容隐藏,因为您在此处使用Outer作为变量的类型:

Outer o = new Outer();

要隐藏Outer后面abs的实现,您可以编写一个返回abc的方法,该方法实际返回Outer

public static getAbc() { return new Outer(); }

现在使用main方法:

// you should probably put your main method in another class, together with getAbc
// this way the code can better demonstrate how to hide implementation.
public static void main(String[] args)
{
    abc o = getAbc();
    o.dance();
}

现在,您的main方法对Outer一无所知。它只知道abc

您也可以在JDK中学习示例。例如,Stream接口有一个名为of的方法,它返回Stream

Stream<String> stream = Stream.of("Hello", "foo", "bar");

ReferencePipeline.Head类和Arrays类中调用一堆方法后,实际返回的是StreamSupport。看到藏在这里?作为界面的用户,您不需要知道of实际返回的内容。您只需要知道它返回的内容可以执行Stream接口指定的所有操作。

这样做的一个好处是,如果有一天StreamSupport的代码被更改为返回其他内容,那么您的代码仍然可以正常工作和编译,因为无论它返回什么,它都会实现{{1} } interface具有所有功能。