首页 > 试题广场 > Java抽象类和接口的区别?
[问答题]

请你说明一下Java抽象类和接口的区别?

191个回答

添加回答
    含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract classabstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
    接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是publicprotected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7.一个类可以实现多个接口,但只能继承一个抽象类。
         下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:
public abstract class BaseServlet extendsHttpServlet
{
           publicfinal void service(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException
           {
                    记录访问日志
                    进行权限判断
if(具有权限)
{
         try
         {
                  doService(request,response);
}
         catch(Excetpione)
         {
                            记录异常信息
         }
}
           }
           protectedabstract void doService(HttpServletRequest request, HttpServletResponseresponse) throws IOExcetion,ServletException; 
//注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的
}
 
public class MyServlet1 extends BaseServlet
{
protected voiddoService(HttpServletRequest request, HttpServletResponse response) throwsIOExcetion,ServletException
           {
                    Servlet只处理的具体业务逻辑代码
           }
 
}
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。

网上找到的,感觉总结的很好
发表于 2018-12-25 11:42:27 回复(9)
梳理下: 1定义:抽象类是用abstract修饰的类,接口是一种规范 2 修饰符:抽象类默认为public修饰,接口默认为public abstrct 3 成员变量:抽象类中有普通成员变量,接口中只能有public final static 4 构造方法:抽象类有,接口没有 5 方法:抽象类除了有抽象方法,还可以有具体方法,接口中没有具体方法 6实现:一个类可以实现多个接口,但是只能继承一个类
编辑于 2019-02-15 10:19:31 回复(0)
1. 抽象类可以有构造器,接口没有
2. 抽象类可以自定义成员变量,接口成员变量默认为public static final
3. 抽象类中的方法不一定是抽象的,接口中的方法默认是抽象的
4. 抽象类中的方法可以实现,接口中的方法不能实现
5. 一个类只能继承一个抽象类,但是可以实现多个接口
6. 一个类继承抽象类可以直接调用抽象类的方法,而实现接口则必须重写其中的方法
编辑于 2019-03-13 12:28:32 回复(0)
抽象类使用abstract修饰的,抽象类中的方法不必全是抽象方法,抽象类的子类必须实现抽象类的全部方法,否则是子类也是抽象类。 接口是个特殊的抽象类,全部是抽象方法
发表于 2019-02-25 08:11:34 回复(0)
一方面,二者的使用目的不同。 抽象类,是一个模板,是一个半成品,让子类去完善。接口是一个规范,是更抽象的,让类按照接口的规范实现方法。 另一方面,二者用法也有区别。 接口的属性必须是公有静态常量,抽象类并无要求。 抽象类有构造方法,让子类去调用,接口并没有构造方法。 接口中只有抽象方法,默认方法,和私有方法没有实例方法,而抽象类中可以有实例方法。 抽象类中可以有代码块,接口中没有。
发表于 2019-01-09 23:30:54 回复(0)
相同点:都不能创建对象。 都可以定义抽象方法,并且必须在子类中重写。 不同点:抽象类中可以有抽象方法和普通方法,并且方法得访问修饰符随意。接口中只能有抽象方法,并且方法得访问修饰符只能是public 关键字不同 抽象类abstract 借口interface 抽象类只能单继承,接口可以多实现。
发表于 2019-04-13 08:56:06 回复(0)
不同: ①抽象类中可以定义构造器;接口中不可以定义构造器 ②抽象类中可以有抽象方法和普通成员方法;接口中只能有抽象方法 ③抽象类中成员访问限定符可以是public、protected、defualt、private;接口中成员只能是public ④抽象类中可以定义成员变量;接口中的成员变量实际上都是常量(默认被final修饰) ⑤抽象类中可以定义静态方法;接口中不能有静态方法 ⑥一个类只能继承一个抽象类,但可以实现多个接口 ⑦有抽象方法的类必须定义为抽象类,而抽象类可以不含抽象方法 相同: ①都不能被实例化 ②都可以作为引用类型 ③一个类如果继承了某个抽象类或实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类扔需被声明为抽象类
编辑于 2019-03-28 20:43:03 回复(0)
抽象类和接口的基本概念就不多说了。说说它们间的区别吧,主要有以下几点:
1.接口只能抽象方法(但1.8以后,可以有Default 和 static 方法),抽象类有抽象和非抽象的方法;
2.接口没有构造函数,抽象类有构造函数;
3.接口中变量默认final(final/static),抽象类变量为final, non-final, static and non-static
4.接口中成员可访问性默认public抽象类成员可为private、default、protected、public
5.一个接口能继承多个接口,一个抽象类能继承一个类实现多个接口

发表于 2019-05-22 16:53:05 回复(0)
1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以
有非抽象的方法
2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定
3. 一个类可以实现多个接口,但最多只能实现一个抽象类
4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
发表于 2019-04-26 13:58:48 回复(0)
抽象类和接口都不能直接实例,抽象类要被子类继承,接口要被类实现;接口只能做方法申明,抽象类可以做方法申明也可以做方法实现;接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量;抽象类里的抽象方法必须全部被子类实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类;同样一个类实现接口的时候,如果不能全部实现接口方法,那么该类也只能是抽象类;抽象类里可以有普通方法但接口不行;如果一个类里有抽象方法,那么该类只能是抽象类;接口可以继承接口并且可以继承多个接口,但类只能单继承
发表于 2019-04-25 17:45:56 回复(0)
1.抽象类不能被实例化,而接口能被实例化
2.抽象类可以有构造器 接口不能有构造器
3.抽象类可以有默认的方法,实现 接口完全是抽象的,它根本不存在方法的实现。
4.抽象类可以有构造器 接口不能有构造器。
5.抽象方法可以继承一个类和实现多个接口, 接口只可以继承一个或多个其它接口。

发表于 2019-04-25 17:41:32 回复(0)
抽象类可以被实例化,接口不可以 抽象类中可以有静态方法,接口中不可以 抽象类中可以有普通成员变量,接口中没有
编辑于 2019-04-25 17:21:35 回复(0)
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
发表于 2019-04-25 14:55:25 回复(0)
抽象类,抽象似有似无,你说它是 它不是,你说它不是又是。 假如这个抽象说指的是嘴,那么我可以说它是人的嘴巴,也可以说是动物的嘴巴。
发表于 2019-04-16 16:59:21 回复(0)
抽象类 接口 1.构造方法:有;无 2.成员变量: 普通:有;无 静态:有且访问类型任意;默认public static final 3.方法: 普通:有;无 静态:有;8后有 抽象:public、protected;默认public abstact 4.关键字:abstract;interface 5.继承性:类仅继承一个;类可实现多个 6.关系:是不是;有没有 接口是一种隐式的、特殊的抽象类
发表于 2019-03-14 00:02:56 回复(0)
抽象类是被继承的,而接口只能被实现,接口中只能有方法定义,抽象类中有抽象方法,也可以有具体方法。jdk8后接口中能定义方法了,默认方法,之所以这样,是为了既有的类库增加新功能,不用对这些类重新设计,collection接口中增加stream方法,就不用在list和set中copy这个方法了,这个设计带来了多继承的问题。
编辑于 2019-02-14 10:45:50 回复(2)
抽象类用abstract修饰,内部成员可以有抽象方法也可以没有,可以有构造。 接口只有4种成员方法,默认,私有,抽象,静态,默认用default修饰,必须给出方法体,私有分为普通私有和静态私有分别给默认和静态默认方法提供调用,抽象方法默认用public abstract修饰,可以不加,成员变量默认用 public final static 修饰,必须给出初值。
发表于 2019-01-20 07:55:47 回复(0)
将一些类的公有属性和行为向上提取抽象出的类,用abstract修饰的类叫作抽象累。 用来实现某种功能,用interface修饰的一种新的类型叫作接口。 相同点,接口和抽象类均有抽象方法,静态的全局属性,均不可以实例化。 区别1修饰的关键词不同 2抽象类里面可以有普通的方法,接口里面不可以 3抽象类和类之间是继承关系,接口和类是实现关系 4接口和接口允许多继成
编辑于 2019-01-11 11:33:19 回复(0)
本人认为区别为:
在jdk1.8之前,接口里面不能实现方法,在1.8版本之后可以在接口里面实现方法,用default修饰.接口里面的变量默认用public static final 修饰.只能用public,而且还可以实现多继承
抽象类里面可以用public protected  修饰变量.
编辑于 2018-12-21 09:49:26 回复(0)
接口是抽象的抽象类,只能定义常量和抽象方法,用于规定一些特殊的行为,而抽象类可以有实例变量和实例方法
发表于 今天 22:19:41 回复(0)