我正在学习Java编程,我是初学者。我现在正在学习接口。我遇到了以下两个简单的例子,我怀疑那些
PROGRAM1
public interface Callback {
void callback(int param);
}
class Client implements Callback {
// Implement Callback's interface
public void callback(int p) {
System.out.println("callback called with " + p);
}
void nonIfaceMeth() {
System.out.println("Classes that implement interfaces " +
"may also define other members, too.");
}
}
class TestIface {
public static void main(String args[]) {
Callback c = new Client();
c.callback(42);
// c.nonIfaceMeth();
}
}
计划2
class Client implements Callback {
// Implement Callback's interface
public void callback(int p) {
System.out.println("callback called with " + p);
}
void nonIfaceMeth() {
System.out.println("Classes that implement interfaces " +
"may also define other members, too.");
}
}
class TestIface {
public static void main(String args[]) {
Client c = new Client();
c.callback(42);
}
}
Program1 和 Program2 都会提供相同的输出。
在 Program1 中,变量c 被声明为接口类型, Program2 ,变量c 声明属于Class类型。
我怀疑这两个程序之间的区别是什么以及创建Interface类型变量的优点是什么?
请帮助我理解这个概念。 TIA
答案 0 :(得分:2)
我会尽量保持简短,因为网络是完全解释接口。
接口是一份合同。许多类都可以实现接口。使用接口是松散耦合代码组件的一种方法。
在Program1中,变量c被声明为接口类型
这意味着可以使用此接口的任何实现来创建具体对象,并且代码不应该中断。
并且在Program2中,变量c被声明为Class类型。
这意味着每次需要使用不同的实现时,都必须更改代码以使用正确的类。你的代码非常有凝聚力。
当您开始研究依赖注入或工厂模式等事情时,它会更有意义。在单元测试中也很有用。
<强>更新强>
根据您的评论
我想要这两个语句之间的区别“回调c = new Client();“和”Client c = new Client();“
目前这是非常概念性的,但Callback c = new Client()
允许您随时更改变量C
的类型。假设您的代码中还有一个其他实现ImportantClient
,其中接口用于声明您可以随时将其更改为c = new ImportantClient()
的变量。但是,如果您使用的是Client c = new Client();
答案 1 :(得分:1)
使用接口的一个原因是您希望减少类或组件之间的依赖关系。
如果您有一个可以将接口作为参数的方法,例如:
public int countItems(List myList) { ... }
...然后您可以传入其类实现List
接口的任何对象,而不会在方法中对该依赖项进行硬编码。
在您的情况下,使用接口Callback
可以在代码中使用其他类,如果它们实现了Callback
接口。
另一个原因是它为您提供了选择具体课程的灵活性。如果创建对象并保留对接口的引用,则会限制您仅通过接口的方法与对象进行交互。这意味着将来你可以改变你构造的具体类,只要它实现了接口,你的代码就可以继续工作而不需要修改。
答案 2 :(得分:1)
在说
时,两者都是相同的Client c = new Client();
实际上,您只是在创建客户端的对象。并调用class Client
。
当你说
时Callback c = new Client();
您只是创建CallBack
类型的引用,但在运行时正在创建Object
Client
。所以两者在你的情况下是一样的。