橘子味的心
标题:Java接口

java中的接口是类的蓝图。 它有静态常量和抽象方法。java中的接口是一种实现抽象的机制。 接口中只有抽象方法而不是方法体。接口用于在Java中实现抽象和多重继承。

Java接口也表示IS-A关系。它不能像抽象类一样被实例化。

为什么要使用Java接口?

需要使用接口主要有三个原因。如下面给出。

  • 它用于实现抽象。
  • 通过接口,可以支持多重继承的功能。
  • 它可用于实现松耦合。

Java 8接口的改进

由于Java 8,接口可以有默认和静态方法,稍后讨论。

由编译器内部添加
java编译器在接口方法之前添加publicabstract关键字。还有,它在数据成员之前添加publicstaticfinal关键字。

换句话说,接口字段默认是publicstaticfinal,方法默认是publicabstract

了解类和接口之间的关系

如下图所示,一个类扩展了另一个类,一个接口扩展了另一个接口,一个类实现了一个接口。

Java接口示例

在这个例子中,Printable接口只有一个方法,它的实现是在A类中提供的。

  1. interface printable {
  2. void print();
  3. }
  4.  
  5. class A6 implements printable {
  6. public void print() {
  7. System.out.println("Hello, Interface");
  8. }
  9.  
  10. public static void main(String args[]) {
  11. A6 obj = new A6();
  12. obj.print();
  13. }
  14. }
  15. Java

上面代码执行结果如下 -

  1. Hello, Interface
  2. Java

Java接口示例:Drawable

在这个例子中,Drawable接口只有一个方法。 它的实现由RectangleCircle类提供。 在实际情况下,接口由一些开发者定义,但实现由不同的实现提供者提供。 并且它被别人使用。实现部分被使用接口的用户隐藏。

创建一个 Java 文件:TestInterface1.java,其代码如下 -

  1. //Interface declaration: by first user
  2. interface Drawable {
  3. void draw();
  4. }
  5.  
  6. // Implementation: by second user
  7. class Rectangle implements Drawable {
  8. public void draw() {
  9. System.out.println("drawing rectangle");
  10. }
  11. }
  12.  
  13. class Circle implements Drawable {
  14. public void draw() {
  15. System.out.println("drawing circle");
  16. }
  17. }
  18.  
  19. // Using interface: by third user
  20. class TestInterface1 {
  21. public static void main(String args[]) {
  22. Drawable d = new Circle();// In real scenario, object is provided by
  23. // method e.g. getDrawable()
  24. d.draw();
  25. }
  26. }
  27. Java

执行上面代码得到以下结果 -

  1. drawing circle
  2. Java

Java接口示例:Bank

让我们来看看另一个提供了Bank接口实现的java接口的例子。创建一个 Java 文件:TestInterface2.java,其代码如下 -

  1. interface Bank {
  2. float rateOfInterest();
  3. }
  4.  
  5. class SBI implements Bank {
  6. public float rateOfInterest() {
  7. return 9.15f;
  8. }
  9. }
  10.  
  11. class PNB implements Bank {
  12. public float rateOfInterest() {
  13. return 9.7f;
  14. }
  15. }
  16.  
  17. class TestInterface2 {
  18. public static void main(String[] args) {
  19. Bank b = new SBI();
  20. System.out.println("ROI: " + b.rateOfInterest());
  21. }
  22. }
  23. Java

执行上面代码得到以下结果 -

Java多继承接口

如果一个类实现了多个接口,或者一个接口扩展了多个接口,即被称为多重继承。

参考以下示例代码的实现 -

  1. interface Printable {
  2. void print();
  3. }
  4.  
  5. interface Showable {
  6. void show();
  7. }
  8.  
  9. class A7 implements Printable, Showable {
  10. public void print() {
  11. System.out.println("Hello");
  12. }
  13.  
  14. public void show() {
  15. System.out.println("Welcome");
  16. }
  17.  
  18. public static void main(String args[]) {
  19. A7 obj = new A7();
  20. obj.print();
  21. obj.show();
  22. }
  23. }
  24. Java

执行上面代码得到以下结果 -

  1. Hello
  2. Welcome
  3. Java

问题:在java中不支持通过类实现多继承,但可通过接口实现,为什么?

正如在继承章节中所解释的,在类中不支持多重继承是因为模糊。 但是在接口的情况下可以支持,因为接口没有歧义,接口的具体实现由实现类提供。 例如:

  1. interface Printable {
  2. void print();
  3. }
  4.  
  5. interface Showable {
  6. void print();
  7. }
  8.  
  9. class TestTnterface3 implements Printable, Showable {
  10. public void print() {
  11. System.out.println("Hello");
  12. }
  13.  
  14. public static void main(String args[]) {
  15. TestTnterface1 obj = new TestTnterface1();
  16. obj.print();
  17. }
  18. }
  19. Java

上面代码执行得到以下结果 -

从上面的例子可以看到,PrintableShowable接口有相同的方法,但它的实现是由TestTnterface1类提供的,所以没有歧义。

接口继承

类可以实现多个接口,但接口也扩展另一个接口。

  1. interface Printable {
  2. void print();
  3. }
  4.  
  5. interface Showable extends Printable {
  6. void show();
  7. }
  8.  
  9. class TestInterface4 implements Showable {
  10. public void print() {
  11. System.out.println("Hello");
  12. }
  13.  
  14. public void show() {
  15. System.out.println("Welcome");
  16. }
  17.  
  18. public static void main(String args[]) {
  19. TestInterface4 obj = new TestInterface4();
  20. obj.print();
  21. obj.show();
  22. }
  23. }
  24. Java

执行上面代码,得到如下结果 -

  1. Hello
  2. Welcome
  3. Java

Java 8接口中的默认方法

从Java 8开始,我们可以在接口中有方法体。 但需要使其为默认方法。现在来看看一个例子,创建一个Java文件:TestInterfaceDefault.java,其代码如下 -

  1. interface Drawable {
  2. void draw();
  3.  
  4. default void msg() {
  5. System.out.println("default method");
  6. }
  7. }
  8.  
  9. class Rectangle implements Drawable {
  10. public void draw() {
  11. System.out.println("drawing rectangle");
  12. }
  13. }
  14.  
  15. class TestInterfaceDefault {
  16. public static void main(String args[]) {
  17. Drawable d = new Rectangle();
  18. d.draw();
  19. d.msg();
  20. }
  21. }
  22. Java

执行上面代码,得到如下结果 -

  1. drawing rectangle
  2. default method
  3. Java

Java 8接口中的静态方法

从Java 8开始,我们可以在接口中有静态方法。 让我们来看看下面的一个例子,创建一个Java文件:TestInterfaceStatic.java 其代码如下:

  1. interface Drawable {
  2. void draw();
  3.  
  4. static int cube(int x) {
  5. return x * x * x;
  6. }
  7. }
  8.  
  9. class Rectangle implements Drawable {
  10. public void draw() {
  11. System.out.println("drawing rectangle");
  12. }
  13. }
  14.  
  15. class TestInterfaceStatic {
  16. public static void main(String args[]) {
  17. Drawable d = new Rectangle();
  18. d.draw();
  19. System.out.println(Drawable.cube(3));
  20. }
  21. }
  22. Java

执行上面代码,得到如下结果 -

  1. drawing rectangle
  2. 27
  3. Java

问题:什么是标记或标记的接口?

没有成员的接口(仅定义一个空的接口)称为标记或标记接口。 例如:可序列化,可克隆,远程等。它们用于向JVM提供一些基本信息,以便JVM可以执行一些有用的操作。

  1. //How Serializable interface is written?
  2. public interface Serializable{
  3. }
  4. Java

Java嵌套接口

注意: 一个接口中可以有另一个接口,即被称为嵌套接口。有关于这方面的知识,将在嵌套类的章节中详细学习。 例如:

  1. interface printable {
  2. void print();
  3.  
  4. interface MessagePrintable {
  5. void msg();
  6. }
  7. }
  8. Java