我对Java的抽象类和接口(interface)的理解

abstract关键字
类似于C++中的虚基类和纯虚函数,java中通过abstract关键字定义抽象方法和抽象类,抽象类也叫抽象基类,它是它的所有导出类的共同部分。相对于具体类,抽象类是抽象的,无法实例化的,它可以描述一个对象是什么样的,具有哪些成员变量,方法,但是不一定给出具体的方法实现,这些未给出具体实现的方法就是抽象方法。抽象类具有如下性质

1.抽象类无法被实例化。
2.只有抽象类才能包含抽象方法
3.抽象类可以不包含抽象方法
4.抽象类的子类如果是具体类,则它一定要重写基类中的抽象方法
5.抽象方法不能被标记为private,否则无法被继承

抽象类决定了导出类中必须重新实现某些方法,这是它与普通基类的最大不同之处,除此之外它的实际作用可能并不是那么大。

接口(interface)
在编写Java程序时,我们可能会遇到这样的情况,类A和类B是不具有任何继承关系的两个类,但是他们都有一个类似的方法f(),而类C有一个方法a(),参数是一个对象,它能够调用参数对象的方法f(),但是由于A,B不存在一个相同的基类,所以a()方法只能进行重载,写两份方法才能使A,B都能作为a()的参数,如果类似的需要多了,我们可能需要复制很多份重复的代码,这样就极大地增加了代码的长度,那么就很自然地能够想到,有没有一种方法能够使我们能够调用一系列类而不考虑他们是否有继承关系。
于是就产生了接口,接口是一系列抽象方法的集合,其中的所有方法都是未经实例化的。接口描述的是一系列的动作,它表示对象可以进行什么样的方法调用。在创建类的时候通过implements关键字可以使类实现这个接口,一旦这么做了,在这个类中就一定要给出接口中的所有方法的具体实现。
接口中可以有成员变量,但是它的任何域自动是static和final的,无法被改变。
我们只需要通过接口,就可以通用地操纵所有实现该接口的类,在Java中,接口可以作为方法的参数和返回值,实际上作为参数和返回值的都是实现了该接口的类,例如:

package Interfacetest;

interface test{
	void f();
}

class testimpl_1 implements test{
	@Override
	public void f() {
		System.out.println("testimpl_1:f");
		
	}
}
class testimpl_2 implements test{
	@Override
	public void f() {
		System.out.println("testimpl_2:f");
		
	}
}

public class interfacetest {
	static void calltest(test t) {
		t.f();
	}
	public static void main(String[] args) {
		calltest(new testimpl_1());
		calltest(new testimpl_2());
	}
	
}
/*output:
 * testimpl_1:f
 * testimpl_2:f
 * */

这段代码通过一个接口test,成功地调用了两个不同且无关的类的方法。接口实现了方法定义与实现的分离,我们可以方便地切换方法的不同实现方式。

接口的嵌套与组合
一个类不能继承于多个抽象基类,却可以实现多个接口,这些接口互不相关,通过任何一个接口都可以实现对这个类的调用,但是要注意如果某两个接口之间存在同名方法,且这两个方法除了返回值其他都相同,那么就无法通过编译 ,静态类型检查就会检查出错误,因为仅仅通过返回值是无法区分两个方法的。
接口之间也可以有继承和嵌套关系,一个接口继承另外一个接口,等于是自动换取它的所有抽象方法,但是如果是一个接口A嵌套在接口B当中,接口B是没有接口A中的方法的,只能通过B.A的方式来调用接口A,此时如果有一个类implements了接口B,它实际上什么也没获得,只有implements B.A,才能获取到A中的方法,例如:

package Interfacetest;
interface test{
	interface test1{
		public void a();
	}
	interface test2{
		public void b();
	}
}
class testimpl implements test.test1,test.test2{

	@Override
	public void b() {
		System.out.println("b()");
	}
	@Override
	public void a() {
		System.out.println("a()");
	}
}
public class interfacetest {
	static void calltest(test.test1 t1) {
		t1.a();
	}
	public static void main(String[] args) {
		calltest( new testimpl());
	}
}
/*output:
 * a()
 * */

总结
接口是面向对象编程的一个重要概念,利用好接口可以大幅减少冗余代码,减低方法与方法,类与类之间的耦合度,完美符合软件构造设计中高内聚,低耦合的目标,因此尽量多地面向接口编程,是提高代码质量和复用性的一个有效手段。但在不必要使用接口的地方也无需多此一举,避免接口的滥用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值