抽象类与接口的区别

本文详细阐述了抽象类与接口的区别,包括定义、特点、语法差异及应用场景,通过实例帮助读者深入理解两者之间的关系。

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

抽象类与接口的区别

作者:张小飞 iteye账号:z_xiaofei168

       现在好多公司的面试题都会问到这个题目,一般问到这个问题,有时候一时想不出来该怎么表述,下面我就给大家好好讲下其中的关系。

       含有 abstract修饰符的 class即为抽象类, abstract 类不能创建的实例对象。含有类不能创建的实例对象。含有abstract方法的类必须 定义为 abstract class类中定义抽象方法必须在具体子类中实现, 所以,不能有抽象构造方法或静态方法。如果的子类没实现父中所有抽象方法,那么子类也必须定义为abstract类型。
       接口(interface)可以说成是抽象类的 一种特例,接口中所有方法都必须是抽象的。接口中的方法默认定义为public abstract类型, 接口中的成员变量类型默认为public static final。
下面比较一两者的语法区别:
     异同点:

    1).抽象类可以有实现(包括构造函数),而接口不可以有任何实现,重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。
    2).抽象类中还以有成员变量(包含静态成员变量)、属性、常量和静态方法,并且他们可以是非公共的;而接口中不能有成员变量、常量、静态方法,只能有公共的属性。
    3).抽象类可以从另一个类或者一个/ 多个接口派生;而接口不能从另一个类派生却可以实现另一个或多个接口

    相同点:

       1)、不能实例化;
       2)、包含未实现的方法声明;
       3)、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

 

        下面用简单的案例来看下:

        抽象类:

 

public abstract class TestCXL {

	/**
	 * 抽象类中还以有成员变量(包含静态成员变量)
	 * 并且他们可以是非公共的,比如private,也可以是public
	 */
	private static String cxl1 = "CXL1";
	private String cxl2 = "CXL2";
	
	/**
	 * 构造方法
	 */
	public TestCXL() {
		super();
	}

	/**
	 * 抽象类可以有实现(包括构造函数)
	 * @return
	 */
	public String method1(){
		return "method1";
	}
	
	/**
	 * 抽象类中还可以有静态方法
	 * @return
	 */
	public static String method2(){
		return "method2";
	}
	
	/**
	 * abstract class 和 interface有什么异同?
	 */
	
	/**
	 * 抽象类可以包括抽象方法,这是普通类所不能的
	 * 抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们
	 * @return
	 */
	public abstract String method3();
	
	/**
	 * 相同点:1)、不能实例化;
       2)、包含未实现的方法声明;
       3)、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

抽象类和接口的使用:
      1)如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
      2)如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
      3)如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。   
      4)抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
	 */
	
}

 

      接口:

 

 

 

 

public interface TestJK {

	/**
	 * 接口中不能有成员变量、常量、静态方法,只能有公共的属性。
	 */
	
	public static String ss = "SS";
	
	/**
	 * 接口不可以有任何实现
	 * 接口中所有方法都必须是未实现的
	 * @return
	 */
	public String method1();
	
}

     派生类:

public class TestCXLPC extends TestCXL{

	/**
	 * 重写/铺盖父类 的抽象方法
	 */
	@Override
	public String method3() {
		// TODO Auto-generated method stub
		return null;
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值