需要澄清JAVA中的接口概念

时间:2015-05-08 06:33:50

标签: java interface

我正在学习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

3 个答案:

答案 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。所以两者在你的情况下是一样的。