Java面试——抽象类和接口

转载 2018年04月16日 11:27:47
原文:https://blog.csdn.net/Hhc0917/article/details/54755001

自己的理解: 
接口类描述的是行为 抽象类描述的是根源; 
接口是对动作的抽象,抽象类是对根源的抽象。

很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。 
在讨论它们之间的不同点之前,我们先看看抽象类、接口各自的特性。 
抽象类

抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以JDK中的GenericServlet为例: 
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { 
// abstract method 
abstract void service(ServletRequest req, ServletResponse res);

void init() {
    // Its implementation
}
// other method related to Servlet
  • 1
  • 2
  • 3
  • 4
  • 5


当HttpServlet类继承GenericServlet时,它提供了service方法的实现:

public class HttpServlet extends GenericServlet { 
void service(ServletRequest req, ServletResponse res) { 
// implementation 
}

protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    // Implementation
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    // Implementation
}

// some other methods related to HttpServlet
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10


接口

接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。以Externalizable接口为例:

public interface Externalizable extends Serializable {

void writeExternal(ObjectOutput out) throws IOException;

void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
  • 1
  • 2
  • 3
  • 4


当你实现这个接口时,你就需要实现上面的两个方法:

public class Employee implements Externalizable {

int employeeId;
String employeeName;

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    employeeId = in.readInt();
    employeeName = (String) in.readObject();

}

@Override
public void writeExternal(ObjectOutput out) throws IOException {

    out.writeInt(employeeId);
    out.writeObject(employeeName);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17


抽象类和接口的对比

这里写图片描述 
补充: 
1.抽象类可以不包含静态方法,接口也不能包含静态方法; 
2.抽象类和接口都可以包含静态成员变量,抽象类中静态成员变量访问类型可以任意,但接口中定义的变量只能是public static final 类型,并且默认为public static final 类型; 
3.抽象类中可以包含普通成员变量,接口中没有普通成员变量。 
4.抽象类中的方法method不能同时是静态的; 
原因: 
观点一: 
我是这样理解的:抽象类是不能实例化的,即不能被分配内存,而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被分配内存,而static方法必须被分配内存。所以抽象类中不能有静态的抽象方法。 
这和接口是一样的,接口中的方法也只能是 public abstract修饰的,不能加上static。 
观点二: 
abstract class A { 
static void doSomething() ; 

不能通过编译是因为你没有定义doSomething 的方法体,比如该语句最后你加上{},就可以了用了.这时候doSomething 是A的一个类方法. 
如果你想把它定义为一个抽象方法那么你必须定义它的时候使用关键字abstract.如果你想定义一个方法同时使用关键字abstract 和static 这是办不到的.你想想,static 方法是类方法,它是不允许子类覆写(override)的(所以必须在定义的时候给出实现),而abstract方法,是只有特征标,没有实现的方法,是必须由子类来覆写的,两者是水火不相容的,sun当然不会允许定义一个同时为abstract 和static 的方法。

至于接口和抽象类还有点不同,因为它是纯粹的设计,不涉及任何的实现,它所有的方法都是共有和抽象的(关键字public和abstract可以省略)所以接口不能有static方法(类方法),上面提到的static void doSomething(){};在抽象类中可以存在,但是在接口中是不允许的。

顺便提以下,在接口中可以定义staic的属性的。实际上接口中定义的属性必须是static,final和public的(因为是必须的,所以这3个关键字也都是可以省略的) 
原则一:static永远不能和abstract碰头; 
原则二:interface是更抽象的抽象类,接口的所有方法都未实现,接口的方法默认为public abstract ,根据原则一,当然不能是static了; 
原则三:抽象类是部分实现的,其中non-abstract方法可以带static,abstract方法不能带static;

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

如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。 
如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。 
如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

C++的profile辅助模板类 升级版

(如果没看过"C++的profile辅助模板类" 先去看看那里的说明部分http://www.csdn.net/Develop/read_article.asp?id=26029 )先看例子:  PR...
  • coolcch
  • coolcch
  • 2004-03-29 10:24:00
  • 565

java语言中关于抽象类和接口的区别(面试经常问到,因此总结一下)

写下这篇文章的原因是基本上是在自己面试的时候很多公司都问我们这个问题,但是此前自己回答的都比较模糊,抓不到重点,毫无规律,特此在这总结一下。          先对他们进行说明:           ...
  • u014492098
  • u014492098
  • 2014-12-06 09:51:19
  • 2130

面试常见题---------java中抽象类跟接口的区别

含有abstract修饰符的class 即为抽象类,abstract类不能创建实例对象,含有abstract的方法的类必须定义为abstract class ,abstract class 里的方法不...
  • huangchunwju
  • huangchunwju
  • 2014-04-23 11:31:16
  • 1091

Java常见面试问题:抽象类与接口的区别

很多常见的Java面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。 在讨论它们之间的不同点之前,我们先看看抽象类、接口各自...
  • napoleonjk
  • napoleonjk
  • 2014-08-11 14:24:30
  • 962

10个Java抽象类和接口的面试题

1. Java抽象类可以有构造函数吗?可以有,抽象类可以声明并定义构造函数。因为你不可以创建抽象类的实例,所以构造函数只能通过构造函数链调用(Java中构造函数链指的是从其他构造函数调用一个构造函数)...
  • f346867698
  • f346867698
  • 2018-03-04 11:00:44
  • 263

面试题_抽象类和接口的区别

含有abstract修饰符的class 即为抽象类,abstract类不能创建实例对象,含有abstract的方法的类必须定义为abstract class ,abstract class 里的方法不...
  • baidu_31337243
  • baidu_31337243
  • 2015-09-15 21:35:32
  • 2053

抽象类的理解及有关面试题

抽象类的概述与特点 A:不懂,太抽象了 B:抽象类特点 a:抽象类和抽象方法必须用abstract修饰 *abstract class 类名() *public abstract void ...
  • uotail
  • uotail
  • 2017-05-03 22:06:33
  • 621

面试时必问题:接口和抽象类 有什么区别??

发现面试的时候最常问的就是接口和抽象类有什么区别?? 类也属于类,所以类就只能被单继承,而却可以实现多个接口。。 还有一些接口常识: 1,接口不能利用new去实例化  一个对象,但却可以声明接口变量,...
  • zrf1335348191
  • zrf1335348191
  • 2015-12-04 14:20:24
  • 1022

笔面试中被问到n次的问题——抽象类和接口

一、表格展示   接口 抽象类 多继承 支持 不支持 类型限制 没有 有,只能...
  • wang_bigworld
  • wang_bigworld
  • 2015-02-08 11:48:33
  • 516

面试题--抽象类和接口的区别

下述说法中抽象类与接口的区别正确的有哪些? 正确答案: A B C A.抽象类中可以有普通成员变量,接口中没有普通成员变量。 B.抽象类和接口中都可以包含静态成员变量。 C.一个类可以实现多...
  • Mrzhoug
  • Mrzhoug
  • 2016-06-10 09:38:43
  • 2449
收藏助手
不良信息举报
您举报文章:Java面试——抽象类和接口
举报原因:
原因补充:

(最多只允许输入30个字)