首页 > 试题广场 >

Java7特性中,abstract class和interf

[不定项选择题]
Java7特性中,abstract class和interface有什么区别。
  • 抽象类可以有构造方法,接口中不能有构造方法
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量
  • 抽象类中不可以包含静态方法,接口中可以包含静态方法
  • 一个类可以实现多个接口,但只能继承一个抽象类。
推荐
含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。 
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。 
下面比较一下两者的语法区别: 
1.抽象类可以有构造方法,接口中不能有构造方法。 
2.抽象类中可以有普通成员变量,接口中没有普通成员变量 
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。 
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。 
5. 抽象类中可以包含静态方法,接口中不能包含静态方法 
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。 
7. 一个类可以实现多个接口,但只能继承一个抽象类。 
下面接着再说说两者在应用上的区别: 
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用, 
例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下: 
package com.lei;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class BaseServlet extends HttpServlet {

 /**
 * serialVersionUID属性概述
 * 
 */
 private static final long serialVersionUID = 1L;

 public final void service(HttpServletRequest request,
 HttpServletResponse response) throws IOException, ServletException {
 // 记录访问日志
 // 进行权限判断
 if (true)// if条件里写的是“具有权限”
 {
 try {
 doService(request, response);
 } catch (IOException e) {
 // 记录异常信息
 }
 }

 }

 protected abstract void doService(HttpServletRequest request,
 HttpServletResponse response) throws IOException, ServletException;
}
实现类如下: 
package com.lei;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends BaseServlet{

 /**
 * serialVersionUID属性概述
 * 
 */
 private static final long serialVersionUID = 1L;

 @Override
 protected void doService(HttpServletRequest request,
 HttpServletResponse response) throws IOException, ServletException {
 // TODO Auto-generated method stub
 
 }

}
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。 
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。 
比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。 
编辑于 2015-02-02 20:50:48 回复(38)
我们记住知识点就可以了,至于答案就不用太钻牛角了。
针对本题:
1、抽象类可以有构造,只不过不能new。
2、接口中可以有变量,但是无论你怎么写,最后都是public static final的。
3、抽象类中可以有静态方法,接口中也可以有。

扩展:
1、接口中可以有非抽象的方法,比如default方法(Java 1.8)。
2、接口中可以有带方法体的方法。(Java 1.8)
3、接口中的方法默认是public的。
发表于 2016-07-13 15:29:56 回复(8)
没有什么不可能,java1.8要打脸了
发表于 2015-09-07 16:08:27 回复(8)
ABD
抽象类
特点:
抽象类中可以构造方法
抽象类中可以存在普通属性,方法,静态属性和方法。
抽象类中可以存在抽象方法。
如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
特点:
在接口中只有方法的声明,没有方法体。
在接口中只有常量,因为定义的变量,在编译的时候都会默认加上
public static final 
在接口中的方法,永远都被public来修饰。
接口中没有构造方法,也不能实例化接口的对象。
接口可以实现多继承
接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法
则实现类定义为抽象类。
发表于 2015-09-04 14:25:10 回复(4)

抽象类和接口的区别:

1. 抽象类可以有构造方法,接口中不能有构造方法。
2. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
3. 抽象类中可以包含非抽象普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的方法。
4. 抽象类中的抽象方法的访问权限可以是 public、protected 和默认类型,接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
5. 抽象类中可以包含静态方法,在 JDK1.8 之前接口中不能不包含静态方法,JDK1.8 以后可以包含。
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是 public static final 类型的,并且默认即为 public static final 类型。
7. 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
发表于 2019-07-19 18:11:04 回复(5)
如果是java 7,接口中可以包含的类容有:
1.常量
2.抽象方法

如果是java 8,还可以额外包含:
3.默认方法
4.静态方法

如果是java 9,还可以额外包含有:
5.私有方法
发表于 2021-09-23 10:54:05 回复(0)
答案:AD
A,抽象类可以有非抽象方法和普通成员,因此可以有构造方法,接口只能有抽象方法和final类型的成员变量,不能定义构造方法
B,接口中有final类型的成员变量
C,抽象类也可以有静态方法
D,通过接口可以实现类似多继承的机制
发表于 2015-01-29 15:59:01 回复(0)
发表于 2021-08-24 13:48:30 回复(1)
抽象类可以有构造方法,只是不能new对象,子类可以通过super关键字调用父类的构造方法去给继承来的成员变量赋值。 接口没有普通成员变量,不需要子类赋值,所以没有构造方法。
编辑于 2018-10-17 09:29:30 回复(0)
抽象类的构造器为了让子类构造方法调用时调用的,子类构造方法第一句有一句默认的super
发表于 2017-10-18 09:36:41 回复(0)
还讲jdk7呢
发表于 2022-03-30 17:17:25 回复(0)
抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。原因如下:抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;使用synchronized关键字是为该方法加一个锁。。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰 类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以。锁应该归其子类所有。所以。抽象方 法也就不能用synchronized关键字修饰了;native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个吧方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢?
接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去实现,不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口
发表于 2020-10-03 10:25:51 回复(0)
接口中可以包含静态方法是Java1.8开始的
披萨大叔的回答,我纠正一处
接口中的变量随便写都是public static final,这指的的是默认情况
!--- 接口中允许定义变量,只不过要进行初始化 ---!
编辑于 2020-04-24 11:57:11 回复(0)
接口中public static final 只有常量,没有变量,
发表于 2017-05-04 14:43:17 回复(0)
关于A:抽象类有构造方法,因为抽象类中可以有非抽象的方法和成员,只不过不能直接调用,需要在子类中构造的时候调用它用来初始化抽象类,如果没有指定,系统会分配一个默认无参的构造函数。接口中是没有构造函数的。
关于B:接口中的成员变量是static final修饰的,不是普通成员变量
关于D:这是java特性,正确
编辑于 2016-10-09 15:32:40 回复(2)
C错在 "抽象类中不可以包含静态方法 ",可以包含的;
至于 “ 接口中可以包含静态方法 ”,jdk1.8中可以有,而jdk1.7编译错误
发表于 2015-10-23 08:36:16 回复(0)
抽象类可以有构造方法,只不过不能new出来实例化,但是其子类也是可以复用父类的构造方法的(super)。
发表于 2015-09-19 22:14:05 回复(0)
抽象类可以有构造,只不过不能new。
发表于 2023-05-14 23:05:27 回复(0)
一点补充:
在jdk1.8之后,接口中可以有static或者default修饰的方法体,可以在接口中定义具体的方法
被static修饰的方法体,在接口的实现类中不能被实现或者是重写,也不能被实现类调用static修饰的方法
但是可以通过接口中,在default修饰的方法中调用static修饰的方法,可以实现代码的隐藏和功能的叠加效果。
被default修饰的方法不再必须在实现类中实现,而是由实现类可以进行重写或者直接调用使用

发表于 2022-10-05 11:41:07 回复(0)
我擦
这答案abcd  会不会误人子弟啊 c选项不应该是对的啊
发表于 2015-05-02 20:17:52 回复(0)
ABD
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
类描述对象的属性和方法。接口则包含类要实现的方法。
接口不能包含成员变量,除了static和final变量。
Java只支持单继承,也就是说,一个类不能继承多个类。但是一个类可以实现多个接口
发表于 2015-04-09 18:29:14 回复(1)