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
课程运行该程序。那么,我们究竟在哪里隐藏用户的实现细节?抽象在哪里实现?
答案 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具有所有功能。