使用接口的引用指向它实现类对象

本文探讨Java中多态的应用及面向接口编程的优势。通过示例解释如何使用接口引用指向其实现类的对象,以及这种方法如何简化代码重构,增强程序的灵活性和可维护性。

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

经常看到一个现象,接口的引用指向它实现类的一个对象

例如:List list = new ArrayList<String>();

为什么要这样用,而不使用:ArrayList list = new ArrayList<String>();   这样做的好处是什么

 这其实是Java中多态的一种表现

接口的实现类可以有很多个,如 LinkedList或者Vector等等,如果使用这种方式,List list = new ArrayList<String>();  以后不想用ArrayList了,直接改为你想用的实现类,如List list = new LinkedList<String>();  这样,虽然修改了实现类,但相关list调用方法的代码是不用修改的;如果是ArrayList list = new ArrayList<String>();这种写法,那就有可能要修改非常多代码了,因为,原本list调用了ArrayList中的方法来实现某个功能,再修改实现类过后,list原本调用的方法在LinkedList中不存在,则还要修改对应调用的方法;因此:

两种方式其实都能实现同一种效果,只是接口的引用指向实现类对象这一方法,是用接口来规范了实现的方法,这样子写的化就很清楚的知道哪些方法有,哪些方法没有。

这就是一种设计规范,如果按照这种设计规范来写,就可以免去在修改实现的对象吼调用方法不存在的情况。

这样写的好处是便于程序代码的重构. 这就是面向接口编程的好处

例如:

public class text {
	public static void main(String[] arhs) {
		Test a = new A();
		Test t = new AB(a);
		t.small();
	}
}

interface Test{
	void small();
}

class A implements Test{

	@Override
	public void small() {
		
		System.out.println("我是A");
	}
	
}
class B implements Test{

	@Override
	public void small() {
		// TODO Auto-generated method stub
		System.out.println("我是B");
	}
	
}
class AB implements Test{
	private Test test;
	AB(Test test){
		this.test = test;
	}
	//
	@Override
	public void small() {
		// TODO Auto-generated method stub
		test.small();
	}
	
}

 

【注意】

list只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些自己的、没有在List接口定义的方法是不可以被访问到的

list.add()其实是List接口的方法

但是调用ArrayList的方法如 clone()方法是调用不到的

总结:java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配

接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。

我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值