Java接口:Java接口有什么用?
接口是做什么的?
Java中的接口基本上是一种指定类应该具有哪些方法的方法。从Java8开始,还可以为这些方法指定默认实现。
接口声明看起来很像类声明,只是没有一个方法包含代码。
让我们举个例子。在下面的代码中,我声明了一个名为Animal的接口,它指定了如果一个类“implements”这个接口,它应该有什么样的方法。
Animal.java:
public interface Animal {
void eat();
void call();
void move(int x, int y);
}
此接口指定“implements”此接口的任何类必须至少具有这三个方法。它可能有更多的方法,但它必须有这三个。Move方法必须接受两个int类型的参数,而其他两个方法不能接受任何参数。在这种特殊情况下,所有方法都返回void。
这里没有必要指定public,因为接口方法在默认情况下是公共的。
现在,我们可以创建一个实现此接口的类。
Cat.java:
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("Nom nom nom");
}
@Override
public void call() {
System.out.println("Meouww!!");
}
@Override
public void move(int x, int y) {
System.out.println("Moving to " + x + ", " + y);
}
}
由于我们已经编写了公共类Cat来实现Animal,因此Cat类必须至少具有接口中指定的方法(但它也可能具有其他方法)。我已经为这里的方法创建了虚拟实现。但这有什么用?
强烈推荐
海量程序代码,编程资源,无论你是小白还是大神研究借鉴别人优秀的源码产品学习成熟的专业技术强势助力帮你提高技巧与技能。在此处获取,给你一个全面升级的机会。只有你更值钱,才能更赚钱
如果你是初级程序员可以研究别人的代码提高技术,如果你喜欢搞网盟或者外包,可以让你快速建站,还等什么赶快关注吧,我们会持续输出相关资源
接口有什么用?
我能想到接口的四个主要用途。它们是:
- 使用接口设计程序
- 以相同的方式处理具有相同方法组的类
- 将代码传递给方法
- 定义常量
接口编码
有些人喜欢通过创建组成程序的类将实现的接口来开始设计程序。您首先考虑每个类将具有什么方法,定义接口,然后才开始实际实现方法。
这有时被称为“接口编码”。
这一切都很好,但我们不能在我们的代码中用接口做一些事情,而不是仅仅用它们来设计东西吗?答案是肯定的。
以相似的方式处理相似的类
接口允许我们做的一件事是以类似的方式对待实现接口的类。现在我们已经有了一个Animal接口,并且我们已经有了一个实现它的Cat类,我们可以这样做:
Cat.java:
Animal myCat = new Cat();
这有一点限制,因为即使我们向cat添加更多的方法,animal-type变量也只允许我们直接调用它知道的那些方法。动物界面中的方法。
但现在假设我们创建一个实现接口的新类。
Dog.java:
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("Chmp chmp chmp!");
}
@Override
public void call() {
System.out.println("Woof!!");
}
@Override
public void move(int x, int y) {
System.out.println("Checking out smell at " + x + "," + y);
}
}
Animal[] animals = new Animal[4];
animals[0] = new Cat();
animals[1] = new Dog();
animals[2] = new Dog();
animals[3] = new Cat();
就像我们可以使用接口类型的变量来引用实现它的类的任何对象一样,我们也可以对数组、ArrayList等做同样的事情。
使用接口将代码传递给方法
假设我们想把一些代码传递给一个方法。我们为什么要这么做?例如,当我们用Java创建Swing桌面应用程序时,我们需要告诉按钮它们应该运行什么代码。我们可以这样做,因为在Swing中创建按钮的类JButton有一个专门用于此目的的方法。它被称为AddActionListener。
但是我们如何将代码传递给这个方法呢?AddActionListener接受接口类型的参数。ActionListener接口。该接口有一个名为actionPerformed的方法。
因此,按钮知道它应该在单击时调用传递给AddActionListener的对象的actionPerformed方法。
class ButtonResponse implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("This runs when the button is clicked.");
}
}
JButton button = new JButton();
button.addActionListener(new ButtonResponse());
Test.java:
interface Runner {
public void runMe();
}
public class Test {
public static void main(String[] args) {
runSomething(new Runner() {
@Override
public void runMe() {
System.out.println("Running!");
}
});
}
public static void runSomething(Runner theRunner) {
theRunner.runMe();
}
}
代码输出:运行!
它看起来有点奇怪,但很有效。
Test.java:
interface Runner {
public void runMe();
}
public class Test {
public static void main(String[] args) {
runSomething(()->{ System.out.println("Running!");});
}
public static void runSomething(Runner theRunner) {
theRunner.runMe();
}
}
Code output: Running!
在接口中定义常量
接口的另一个用途是我们可以在接口中定义常量。虽然使用枚举通常更好,而且许多人不赞成这种做法,但在Java中却很常见。
如果我们创建这个接口:
interface Constants {
int TOTAL_ANIMALS = 50;
}
System.out.println(Constants.TOTAL_ANIMALS);
请注意,默认情况下,接口中的常量是public, final 和 static的。
结论
虽然接口最初看起来毫无用处,但它们实际上是Java语言中强大而有用的构造。一旦你知道如何使用它们,你可能会经常使用它们。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!