`
z_xiaofei168
  • 浏览: 200981 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

抽象类与接口的区别

 
阅读更多

抽象类与接口的区别

作者:张小飞 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;
	}

}

 

5
15
分享到:
评论
25 楼 dingran 2013-08-19  
我工作三年了,连多线程都没用过!楼主的精神应该支持,有错误要指正。不要以为自己多牛逼,再牛逼不还是在天朝嘛,玩着别人n年前的成果。
24 楼 yindejie 2013-08-16  
这个。。。。老实说。。。博主的语言表达能力有点差。。。语句不通。。。
23 楼 white_crucifix 2013-08-16  
其实楼主这篇博客本质上没什么问题,就是生错了年代,呵呵,如果是五年前,可能下面就赞美声一片。如今么,大家都看的多了,口味也提高了,还是这么些内容就容易反感,加上一些人装逼心理严重,所以不要在意。
22 楼 xiaoyu1985ban 2013-08-16  
z_xiaofei168 写道
skzr.org 写道
说了很多,都是语法层面的。
还记得曾经考官问过我这个问题,我的回答和你的一样,后来考官告诉我,就一点:“接口是协议规范,抽象类不是。”没有了。

你想表达个什么?分享下你的看法


抽象类在Java语言中体现了一种继承关系,很显然,父类和子类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。接口就不一样了,并不要求interface的实现类和interface定义在概念本质上是一致的,实现类仅仅是实现了interface定义的契约而已。

所以说接口体现的是协议规范。就像JDBC和JMS规范,底层都是接口,而不是抽象类。
21 楼 white_crucifix 2013-08-16  
BabyDuncan 写道
写的很垃圾,可以说是狗屁不通.
什么叫做 "接口中的方法默认定义为public abstract类型"
什么叫做 "含有类不能创建的实例对象"


何必这么较真呢,第一句好像没什么问题吧,第二句明显是打字时候按键食物,把前一句和后一句给拼在了一起。
20 楼 sshitaime 2013-08-16  
不懂,就不要出来得瑟,回家练习会了,再出来得瑟,误导新人。
19 楼 BabyDuncan 2013-08-16  
你这种人,写一些垃圾,晦涩的破博客,有一些刚接触编程的孩子们看了之后更加迷惑了,这种垃圾文章就应该早点删掉,还TMD居然上了首页.
18 楼 BabyDuncan 2013-08-16  
我真想骂你,你写的太垃圾了,什么叫做
"接口不能从另一个类派生却可以实现另一个或多个接口"

接口可以实现接口?你是不是找抽?
17 楼 BabyDuncan 2013-08-16  
写的很垃圾,可以说是狗屁不通.
什么叫做 "接口中的方法默认定义为public abstract类型"
什么叫做 "含有类不能创建的实例对象"

16 楼 skzr.org 2013-08-16  
z_xiaofei168 写道
skzr.org 写道
说了很多,都是语法层面的。
还记得曾经考官问过我这个问题,我的回答和你的一样,后来考官告诉我,就一点:“接口是协议规范,抽象类不是。”没有了。

你想表达个什么?分享下你的看法

语法层面的大家都清楚,可以从实际开发来说说他们的异同更好!

不同点:
  • 关键字不一样;
  • 他们注定不在一个层面上,没有可比性;接口就是协议规范,抽象类定义的就是类,他们本质上就不同。(根都不一样,你怎么比较?)


相同点:除了都是java的基础,其他的相同点感觉他们是两个层面的东西,我反正找不到其他相同点。

如果是规约(协议或接口),就用接口,常见的就是sdk的api就是典型的接口,这个时候你绝对不会使用抽象类提供给别人用。
至于自己用,随你怎么用。

其实电脑中很多类似的:比如usb接口,制定了usb的通讯协议和规范,至于你用抽象还是非抽象来玩,没有人关心。你怎么比较他们,本质上是不同的?
15 楼 ddbird 2013-08-16  
楼主从语法上解释的不错,如果被问到,先把语法上的内容讲一下,就是楼主上面写的,然后再描述下内在含义上2者的区别就差不多了。不过个人非常鄙视问这种问题的面试官,回答出回答不出都不说明太多问题。所以我个人也不会在面试别人时问这问题。
14 楼 z_xiaofei168 2013-08-16  
有看到的各位大侠,给说说所谓的正确答案是什么
13 楼 z_xiaofei168 2013-08-16  
bloodwolf_china 写道
用法是其次,了解其本质。
还能体现这点的就是异常处理。重点不是语法,为什么高级语言都设计有异常机制,能抓住这一点就知道如何优雅的处理异常,而不会代码里到处都是try catch。可惜面试了很多人至今没人能答到点子上,都是关注语法层面上。

您给说下本质,让大家都学习下
12 楼 z_xiaofei168 2013-08-16  
skzr.org 写道
说了很多,都是语法层面的。
还记得曾经考官问过我这个问题,我的回答和你的一样,后来考官告诉我,就一点:“接口是协议规范,抽象类不是。”没有了。

你想表达个什么?分享下你的看法
11 楼 z_xiaofei168 2013-08-16  
2pac 写道
认知过于肤浅

这只是我简单的认识,您给个不肤浅的认识,我们大家学习下?
10 楼 skzr.org 2013-08-16  
bloodwolf_china 写道
用法是其次,了解其本质。
还能体现这点的就是异常处理。重点不是语法,为什么高级语言都设计有异常机制,能抓住这一点就知道如何优雅的处理异常,而不会代码里到处都是try catch。可惜面试了很多人至今没人能答到点子上,都是关注语法层面上。

赞同。现在很多人都非常关注语法,实际上,应该从需求入手,把语言当成工具即可。
9 楼 leonayx123 2013-08-16  
抽象类是“定义”。比如定义了 什么是人
接口是规范归类,比如定义了是黑人还是白人
8 楼 留下的祝福 2013-08-16  
应该说说为什么要抽象类,为什么要接口。且里面的一些实现机制!
7 楼 bloodwolf_china 2013-08-16  
用法是其次,了解其本质。
还能体现这点的就是异常处理。重点不是语法,为什么高级语言都设计有异常机制,能抓住这一点就知道如何优雅的处理异常,而不会代码里到处都是try catch。可惜面试了很多人至今没人能答到点子上,都是关注语法层面上。
6 楼 bloodwolf_china 2013-08-16  
skzr.org 写道
说了很多,都是语法层面的。
还记得曾经考官问过我这个问题,我的回答和你的一样,后来考官告诉我,就一点:“接口是协议规范,抽象类不是。”没有了。

是的,这些答案会误导多少人呢。接口是定义行为,抽象类定义的是什么,关注继承关系。
interface Flyer{
   public void fly();
}

abstract class Bird{
   public abstract  void fly();
}

继承Bird的都是鸟,实现Flyer接口只说明会飞。
接口关注的是行为或动作,抽象类定义的关注继承关系。

相关推荐

    java抽象类与接口区别

    ### Java抽象类与接口的区别 #### 一、引言 在Java编程中,抽象类(Abstract Class)与接口(Interface)都是实现抽象的关键工具。它们各自有着独特的优势和适用场景,掌握这两者的区别有助于开发者更好地设计系统...

    抽象类和接口 区别分析

    ### 抽象类和接口的区别分析 在面向对象编程中,抽象类与接口都是实现代码复用和提高软件模块化的重要工具。它们各自拥有独特的特性和应用场景,掌握这些概念对于编写高质量、可维护性强的代码至关重要。下面我们将...

    JAVA中抽象类与接口的区别

    下面将从多个方面详细介绍抽象类与接口的区别。 ### 一、定义与基本语法 #### 抽象类 抽象类是一种特殊的类,它不能被实例化,只能作为其他类的父类来使用。抽象类中可以包含抽象方法(没有方法体的方法)和具体...

    Java中的类、抽象类和接口的区别和联系

    Java中的类、抽象类和接口的区别和联系

    Java中抽象类和接口的区别

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    java 抽象类与接口的区别

    理解抽象类与接口的区别并恰当运用,有助于提升代码的可扩展性和可维护性,使得软件设计更加灵活和面向对象。在进行Java编程时,应根据项目需求和设计原则,合理选择抽象类或接口来实现特定功能,以达到最佳的设计...

    C#类、接口、虚方法和抽象方法-抽象类和接口的相同点和区别

    这里我们将详细讨论这些概念以及抽象类与接口之间的相同点和区别。 首先,让我们来看看抽象类(Abstract Class): 1. 抽象方法是只有声明没有实现的方法,可以视为没有方法体的虚方法。例如: ```csharp public ...

    JAVA 继承基本类、抽象类、接口区别与联系

    ### JAVA继承基本类、抽象类、接口的区别与联系 #### 一、概述 在Java语言中,类(Class)的设计是面向对象编程的核心之一。Java提供了三种方式来扩展类的功能:基本类、抽象类和接口。这三者之间既有相似之处,也...

    java 抽象类与接口的练习

    接口与抽象类的选择取决于具体的设计需求。如果关注的是行为的规范,且可能有多个实现者,那么接口是更好的选择。如果需要共享实现细节或者提供默认行为,抽象类则更为合适。 在压缩包中的"抽象类与接口"文件中,你...

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    C#中抽象类和接口的区别.txt

    ### C#中抽象类与接口的区别 在C#编程语言中,抽象类和接口都是用于实现面向对象编程中多态特性的关键概念。它们都旨在为其他类提供一种定义行为和特性的模板或规范,但它们之间存在着重要的区别。本文将详细探讨C#...

    详细解析Java中抽象类和接口的区别

    #### 抽象类与接口的区别分析 ##### 实现数量上的差异 - **抽象类**:一个类只能继承一个抽象类。 - **接口**:一个类可以实现多个接口。 这种差异意味着接口更适合用于定义对象间的行为规范,而抽象类则适合定义一...

    Java抽象类与接口区别详解

    Java抽象类与接口区别详解 Java抽象类和接口是Java编程语言中两个非常重要的概念,它们都是Java编程中面向对象编程的基础,但它们之间也存在着很大的区别。在本文中,我们将详细讨论Java抽象类和接口的区别,包括...

    接口与抽象类区别

    接口与抽象类区别 在软件开发中,接口和抽象类是两个常用的概念,但它们之间的区别却让许多人感到困惑。那么,什么是抽象类和接口?它们之间有什么区别?下面,我们就来详细地探讨这个问题。 一、抽象类 抽象类是...

    Java抽象类与接口实验报告

    Java抽象类与接口实验报告

    第7章 抽象类与接口.ppt

    这有助于实现接口与实现的解耦,提高代码的可维护性和扩展性。当一个类实现(implements)接口时,它必须提供接口中所有抽象方法的具体实现。Java允许一个类实现多个接口,以同时满足多种服务需求。 在示例中,`...

    抽象类和接口的区别

    抽象类和接口的区别 【概述】 一个软件设计的好坏,我想很大程度上取决于它的整体架构, 而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时, 你底层的具体实现...

Global site tag (gtag.js) - Google Analytics