Java中接口与抽象类的区别

本文深入探讨了Java中接口与抽象类的概念、特性和使用场景。解释了接口如何描述类的功能而无具体实现,以及抽象类如何包含部分实现和抽象方法。详细对比了两者的区别,包括多重继承、方法实现、变量类型等方面。

接口 (interface)

  1. 概念:主要用来描述类具有什么功能,而并不给出每个功能的具体实现。
  2. 实现(implement):一个类可是实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。
  3. 接口中所有的方法自动属于public。因此,在接口中声明方法时,不必提供关键字public。
  4. 接口中决不能含有实例域。
  5. int compareTo(T other):用这个对象与other比较。如果这个对象小于other则返回负值;如果相等则返回0;否则返回正值。
    static void sort(Object[] a):使用mergesort算法对数组a中的元素进行排序。 要求数组中的元素必须属 于实现了Comparable接口的类,并且元素之间必须是可比较的。
    static int compare(int x,int y):如果想x<y返回一个负数,如果x=y,则返回o,否则返回正值。
    static int compare(doublex,doubley):如果想x<y返回一个负数,如果x=y,则返回o,否则返回正值。
  6. 特性:接口不是类,尤其不能使用new运算符实例化一个接口:x = new Comparable(.);// ERROR
    然而,尽管不能构造接口的对象,却能声明接口的变量:Comparable x ;//0K
    接口变量必须引用实现了接口的类对象,
    x = new Employee( . ); 11 OK provided Employee impletss Comparable
    接下来,如同使用instanceof检查一个对象是否属于某个特定类样,也可以使用instance查-一个对象是否实现了某个特定的接口:
    if (anObject instanceof Comparable) { .,,}
  7. 接口可以继承接口
  8. 接口中的域将被自动设为public static final
  9. 一个类只能继承一个父类,却能实现多个接口
  10. 接口中可以提供一个默认实现。必须用default修饰符标识这样一个方法,这样实现接口的类就可以不用实现直接使用这个方法,也可以覆盖这个方法
public interface Comparable<T>{
	default int compareTo(T other){
		return 0;
	}
}
  1. 一个类继承了一个父类,并实现了一个接口,如果这个父类和接口中存在相同的方法,那么该类调用时会调用父类中的这个方法;一个类实现了一个接口,这个接口继承了一个父接口,如果这个父类接口和接口中存在相同的方法,那么必须覆盖这个子类接口中的方法

抽象类

  1. 抽象类的基本概念
    抽象方法,只声明而未实现的方法我们称为抽象方法,所有的抽象方法都需要用abstract关键字声明,包含抽象方法的类也需要使用abstract关键字声明,抽象类和普通类相比,区别在于抽象类带有抽象方法,抽象方法可以只声明,而不需要方法体。
    代码演示:
package demo; 
public abstract class People{ 
	private String name; 
	//声明抽象方法,没有方法体,直接分号结束 
	public abstract void talk(); 
	public void eat(){ 
	System.out.println(name+”正在学习”); 
	} 
} 

  1. 抽象类和抽象方法必须用abstact关键字来修饰;
  2. 抽象类不能直接实例化,也就是不能直接使用new关键字产生对象;People p = new People(); //错误,People是抽象类,无法实例化
  3. 抽象方法定义时,只需要声明,不需要实现
  4. 含抽象方法的类必须被声明为抽象类,抽象类的子类必须实现所有的抽象方法后,才能被实例化,否则这个子类还是个抽象类
  5. 可以有方法的实现,但是这个方法不是abstract方法
  6. 抽象类中可以有构造器
  7. 抽象类中可以有public,protected和default修饰符
  8. 抽象类可以继承一个类和实现多个接口

接口与抽象类的区别

  1. 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的
  2. 实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
  3. 接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
  4. 抽象类可以有构造函数,接口不可以有构造函数
  5. 抽象类中可以有普通成员变量,接口中没有普通成员变量,只能有常量
  6. 抽象类中的方法可以被static修饰,接口中的方法不可以被static修饰
  7. 抽象类中可以有普通方法和抽象方法,接口中的方法全是抽象方法
  8. 抽象中的方法可以被public,protected等修饰符修饰,接口中的方法全都是public abstract的方法,如果省略修饰符,则默认的也都是public abstract修饰
  9. 一个类只能继承一个抽象类,接口可以被多实现,即一个类只能继承一个类,可以实现多个接口

什么时候使用接口,什么时候使用抽象类

  1. 如果你想拥有一些方法,并且这些方法有默认实现,那么使用抽象类
  2. 如果你想实现多继承,那么就是用接口,java不支持多继承,但是可以实现多个接口
  3. 接口主要用于模块与模块之间的调用
  4. 抽象类主要用于当做基础类使用,即基类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值