我翻阅了许多文章来理解抽象概念。大多数文章都将抽象定义为将实现从使用方法的代码中隐藏起来。
例子
public interface test1 {
String doSomething();
}
public class test2 implements test1 {
String doSomething() {
}
}
public class test3 {
void m1() {
test1 t = new test2();
t.doSomething();
}
}
我的问题是,如果抽象隐藏了实现细节。test3
不知 doSomething()
方法的实现。但是开发者应该知道哪些类实现了这个接口,这些类的目的是什么。那么这里的 "隐藏实现 "到底是什么意思呢?谁能解释一下?
正如你谈到的现实生活中的例子,没有人知道java api中所有类的hashCode()函数是如何实现的,但你知道这个函数的效用是什么。
这里的重点是,使用hashCode()的人,不要去管它的实现细节,也不要去管它在版本中的兼容变化,他可以在适合的情况下使用它。
另外在互联网上也可以找到很好的解释。
抽象不是为了 躲藏 实现细节,它是关于事物如何工作的更高层次的想法。
例如,在你上面的例子中。
public interface test1 {
String doSomething();
}
public class test2 implements test1 {
String doSomething() {
}
}
public class test3 {
void m1() {
test1 t = new test2();
t.doSomething();
}
}
如果其他的类是依赖于测试功能, 该类可以有它在构造函数像, DependentClass(test1 test)
你可以把它作为 DependentClass(new test2())
或 DependentClass(new test3())
. 内部执行 DependentClass
只见 doSomething()
方法的签名,它并不关心它在任何一个 test2
或 test3
类。将来,如果有一些test4的实现,可以在不改变一个字的情况下使用 DependentClass
.
doSomething()
是 隐蔽 从 DependentClass
(它可能使用了一些实现类的私有方法,这些方法在 DependentClass
),但这又不是有抽象的意义。