Java 中的接口有什么作用?

本文通过生动的例子解释了接口在编程中的重要性。接口不仅提供了一种规范,还使得程序更加灵活和易于扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在 知乎 上看到一篇关于 接口的讲解,觉得讲的不错,随拿过来进行保存。


问题:


例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂不是更便捷,还省去了定义接口?接口在java中的作用是什么?个人觉得只是一种规范。大家的看法呢?


回答一:

这是一个初学者非常常见的问题。

例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂不是更便捷,还省去了定义接口?

接口就是个招牌。

比如说你今年放假出去杭州旅游,玩了一上午,你也有点饿了,突然看到前面有个店子,上面挂着KFC,然后你就知道今天中饭有着落了。

KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿(实现接口)。

那么为神马我们要去定义一个接口涅,这个店可以直接卖炸鸡腿啊(直接写实现方法),是的,这个店可以直接卖炸鸡腿,但没有挂KFC的招牌,我们就不能直接简单粗暴的冲进去叫服务员给两个炸鸡腿了。

要么,我们就要进去问,你这里卖不卖炸鸡腿啊,卖不卖汉堡啊,卖不卖圣代啊(这就是反射)。很显然,这样一家家的问实在是非常麻烦(反射性能很差)。
要么,我们就要记住,中山路108号卖炸鸡,黄山路45号卖炸鸡(硬编码),很显然这样我们要记住的很多很多东西(代码量剧增),而且,如果有新的店卖炸鸡腿,我们也不可能知道(不利于扩展)。



回答二:

接口的作用对于很多新手来说很不容易理解,我给大家举个例子。
接口只是一个规范,所以里面的方法都是空的。
假如我开了一个宠物粮店,声明所有宠物都可以来我这里买粮食,这就相当于一个接口,

public interface PetRestaurant {
public void buy();
}

当一只狗看到了,知道自己是宠物,所以它去实现这个接口
public class DogPet implements PetRestaurant {
@Override
public void buy() {
System.out.println("我是狗,我要买狗粮");
}
}
当一只猫看到了,知道自己也是宠物,所以也去实现这个接口
public class CatPet implements PetRestaurant {
@Override
public void buy() {
System.out.println("我是猫,我要买猫粮");
}

}
当狗和猫来我的店之前,我是不知道他们到底是什么,但是当他们来到我的店,我就知道一个要猫粮食,一个要狗粮食。因为他们都实现了 我这个接口,都可以买。下面这个类相当于一个接待顾客的类,即店小二,他接待所有实现了我这个宠物店接口的动物,传进来一个PetRestaurant 类型的宠物,注意,这个PetRestaurant 是接口
public class test {
public void buy(PetRestaurant pet)
{
pet.buy();
}
}

好了,这个时候我这个老板出现了,我可以给他们卖粮食了,相当于测试类
public class Tests {
public static void main(String[] args) {
PetRestaurant dog = new DogPet(); //实例化一个狗,相当于把狗顾客实例化
PetRestaurant cat = new CatPet();//实例化一个猫,相当于把猫顾客实例化

test t = new test(); //实例化一个店小二
t.buy(cat); //把猫交给店小二
t.buy(dog); //把狗交给店小二
}

}
这样运行的结果就是
我是猫,我要买猫粮
我是狗,我要买狗娘

你知道吗,整个过程我这个店主其实根本不知道来的到底是猫是狗还是其他什么,我只要有一个店小二,把这些来的不知什么动物都全部交给店小二,店小二就知道怎么去卖了,因为这些狗啊猫啊都实现了我这个宠物店的接口,而店小二就负责接待所有实现了我这个接口的动物。这就有一个好处,假如明天来了一头小猪,只要它实现了我这个接口,我只管交给店小二处理就OK了,我这个店小二根本不需要变化,我这个店主也只需要实例化一下这个动物就OK
你想,假如没有接口,会怎么办,来一个猫,我要去创造一个猫,还要实例化,来一只狗,我要创建一只狗,同样要实例化,还要配备专门的店小二去接待,就会相当麻烦。


PS:  关于第二个有一些自己的看法,这里面定义并不是很合理。

下面是我写的代码


//定义一个接口
interface BuySomeThing
{
	public void buy();
}

class Cat implements BuySomeThing
{

	@Override
	public void buy()
	{
		System.out.println("我是猫,我要买猫粮");
		
	}
	
	
}

class Dog implements BuySomeThing
{

	@Override
	public void buy()
	{
		System.out.println("我是狗,我要买狗食");
		
	}
	
}

class PetShop
{
	public void Sell(BuySomeThing buySomeThing)
	{
		buySomeThing.buy();
	}
}

public class Test
{
	
	public static void main(String[] args)
	{
		Cat cat = new Cat();
		Dog dog = new Dog();
		PetShop petShop =  new PetShop();
		
		petShop.Sell(cat);
		petShop.Sell(dog);
	}

}




回答三:

能问这个问题,说明(1)你很会思考(2)编程水平还是处于起步阶段。

接口是个规范”,这句没错。
不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?

既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。

统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做
比如说:
我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?
数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。

然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。
这两个对象是什么类型呢?
Object a,b?肯定不行,a > b 这样的语法无法通过编译。
int a,b?也不行?一开始就说了,不一定是数字。
....
所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。
所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。
因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。

如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口


1. 什么是Java的反射机制? Java的反射机制是指在程序运行时动态地获取类的信息并操作类或对象的能力。通过反射,我们可以在运行时获取类的属性、方法、构造器等信息,并且可以在运行时调用类的方法、构造器等。 2. Java中的抽象类和接口有什么区别? 抽象类和接口都是用于实现多态性的机制,但是它们有几个关键的区别。抽象类可以包含非抽象方法,而接口只能包含方法的定义。另外,一个类只能继承一个抽象类,但是可以实现多个接口。 3. 请解释Java中的多态性是如何实现的? Java中的多态性是指同一个方法可以在不同的对象中以不同的形式被调用,实现多态性的方式包括方法重载、方法重写和接口实现。当调用一个方法时,编译器会根据方法的参数类型、方法名和所在类的类型来决定要调用哪个方法。 4. 什么是Java中的线程?如何创建一个线程? 线程是一条独立的执行路径,可以同时执行多个任务。在Java中,线程可以通过继承Thread类或实现Runnable接口来创建。创建线程后,可以调用start()方法来启动线程,并且可以使用sleep()、join()等方法来控制线程的执行。 5. 请解释Java中的垃圾回收机制是如何工作的? Java中的垃圾回收机制是指在程序运行时自动回收不再被使用的内存空间。垃圾回收器会定期扫描堆内存中的对象,当发现某个对象没有任何引用时,就会将其标记为垃圾对象,并且在适当的时候将其回收。 6. 请解释Java中的异常处理机制是如何工作的? Java中的异常处理机制是指在程序执行过程中遇到异常时,可以通过try-catch语句来捕获并处理异常。try块中的代码可以抛出异常,而catch块中的代码可以处理这些异常。如果try块中的代码抛出了异常,那么程序就会跳过这个块并执行catch块中的代码。 7. 什么是Java中的集合框架?请列举一些常用的集合类。 Java中的集合框架是指一组类和接口,用于存储和操作一组对象。常用的集合类包括ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。 8. 请解释Java中的序列化是什么?如何实现Java对象的序列化? Java中的序列化是指将一个Java对象转换为字节序列的过程,可以将序列化后的对象保存到文件或通过网络传输。要实现Java对象的序列化,需要让该对象实现Serializable接口,并且使用ObjectOutputStream类的writeObject()方法来将其序列化。 9. 什么是Java中的注解?它们有什么作用Java中的注解是一种元数据,可以用于为程序元素(类、方法、属性等)添加额外的信息。注解可以用于编译时、运行时或两者同时使用,常用的注解包括Override、Deprecated、SuppressWarnings等。 10. 请解释Java中的泛型是什么?如何使用泛型来实现类型安全? Java中的泛型是指在编译时确定数据类型的一种机制,可以使代码更加灵活和类型安全。通过使用泛型,可以在编译时检查代码的类型安全性,并且可以避免类型转换错误。要使用泛型,可以在类名或方法名后面添加尖括号并指定泛型类型,例如List<String>。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值