我在java中读了很多关于接口的内容。我知道你可以实现多态性和其他很棒的东西(函数指针..等等)。我有理论知识,但实际上有点甚至没有。我一直在使用许多已经制作的界面,如“Runnable”或许多“Listeners”。但我仍然不理解他们100%。如果有人会回答以下问题,我可能会更好地理解:
所以最近我正在学习LibGdx,我遇到了名为“Disposable”的界面。它有一个名为“dispose()”的方法,该方法的文档说明了;
释放此对象的所有资源。
所以我假设这个接口声明如下:
public interface Disposable {
public void dispose();
}
我有一个实现此接口的类。
public class Main implements Disposable {
@Override
public void dispose() {
// TODO Auto-generated method stub
}
}
问题:如果这个方法是空的,那么这个方法怎么做呢?它不能处理任何东西..
我可以在这个类中拥有自己的方法来处理对象。为什么我们需要接口?
这只是一个例子。我遇到过很多类似的界面。
我真的无法理解像这样的接口。
任何有用的帮助。
答案 0 :(得分:1)
您的用例的可能原因:
dispose
。这在垃圾收集器模式中很有用,因此您可以执行garbageCollector.collect(disposable)
。如果接口是某个GarbageCollector
包的一部分,这将是有意义的。close
并需要AutoCloseable
,see here进行比较。答案 1 :(得分:1)
原因是如果你有另一个对象的方法采用Disposable类型,那么期望(确实需要)接口指定的方法存在。可能因为它会在某处调用该方法。
通过这种方式,您可以拥有多个实现Disposable的类(每个类都以自己的方式),然后您可以通过Disposable接口传递该类的实例,该接口将公开接口指定的任何方法。获取Disposable实例的类可以依赖于那种方法。
答案 2 :(得分:1)
通常,库提供接口,因此您可以扩展接口而不是更改内部代码。这将保持使用库的代码的兼容性。
提供空实现取决于开发人员,但在接口文档中,它们提供了实现接口的具体类的实际实现。
答案 3 :(得分:0)
问题是,您可能有许多不同类型的对象,所有这些对象都需要处理。现在,您可以自己编写一系列很好的if-else
语句,尝试确定给定的Object
是否是某种其他类型对象的实例,以便您可以确定它应该如何处理(以及使用哪些方法)它可以触发它)或者你可以像在这里一样定义一个共同的interface
,以便在某个时候希望被处置的所有对象都可以使用。
这意味着您可以根据这个单独的公共interface
引用这些不同的对象,允许它们全部显示为实例Disposable
,这是多态的基石。
这意味着只有Disposable
个对象的列表,您可以快速轻松地调用每个对象的dispose
方法。调用者不关心如何实现它,只是在调用它时,执行所需的合同......
答案 4 :(得分:0)
There is a term in Java "Coding to Interfaces".
Check the link:
http://stackoverflow.com/questions/1970806/coding-to-interfaces
Coding to an interface rather than to implementation. This makes your software/application easier to extend. In other words, your code will work with all the interface’s subclasses, even ones that have not been created yet.
Anytime if you are writing code that interacts with subclasses, you have two choices either; your code directly interacts with subclasses or interacts with interface. Like this situation, you should always favor/prefer to coding to an interface, not the implementation.
To use the interface one can simply call the methods on an instance of the concrete class.
One would call the methods on a reference of the type interface, which happens to use the concrete class as implementation:
List<String> l = new ArrayList<String>();
l.add("foo");
l.add("bar");
If you decided to switch to another List implementation, the client code works without change:
List<String> l = new LinkedList<String>();
This is especially useful for hiding implementation details, auto generating proxies, etc.
Advantages
App/Software is easier to extend
Adds Flexibility to your App.
Helps to maintain the loose coupling of code.
答案 5 :(得分:0)
界面与您的课程的原型类似。它的目的是为您的班级提供结构。
如果您的类正在实现任何接口,则意味着该类必须声明接口中定义的所有属性(即方法)。它可以被认为是你班级的形容词。
如果您有两个类,例如 Eagle 和 Parrot 。然后,您应该创建一个名为 canFly 的界面。现在鹰和鹦鹉可以飞,但它们飞行的方式可能不同。这就是界面没有声明的原因。