首页 > 试题广场 >

下述说法中抽象类与接口的区别与联系正确的有哪些?

[不定项选择题]
在JDK1.7中,下述说法中抽象类与接口的区别与联系正确的有哪些?
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量。
  • 抽象类和接口中都可以包含静态成员常量。
  • 一个类可以实现多个接口,但只能继承一个抽象类
  • 抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。另外,接口和抽象类在方法上有区别:    
1.抽象类可以有构造方法,接口中不能有构造方法。  
2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
3.抽象类中可以有普通成员变量,接口中没有普通成员变量 
4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
7. 一个类可以实现多个接口,但只能继承一个抽象类。二者在应用方面也有一定的区别:接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码。
发表于 2015-04-21 16:16:31 回复(22)
B也算区别?
发表于 2017-05-05 15:26:35 回复(1)
http://www.360doc.com/content/11/0621/17/1073512_128502149.shtml 我觉得这个答案说的蛮好的
发表于 2016-09-26 15:13:34 回复(0)
做过同样的一道题选项是ABCD,感觉题目要说清楚啊
发表于 2016-05-18 19:12:22 回复(0)
D中,Java 8里的接口可以有default方法 ,所以是错的,感谢 @__PureFrog
编辑于 2016-06-21 17:32:31 回复(19)

关注微信公众号:CodingTechWork
更多面试和实践总结干货等你来~

特点

抽象类

接口

构造方法

普通成员变量

普通方法

可以有非抽象的

必须是抽象的

抽象方法的访问类型

publicprotected和默认

只能是public的,默认public abstract

静态方法

可以有

静态成员变量

public static final

其他类

只能继承一个抽象类

可以实现多个接口

应用场景

模块之间通信契约

代码重用

  • 1.普通成员变量:抽象类中可以有普通成员变量,接口中没有普通成员变量(static final变量);
  • 2.方法:抽象类中可以包含非抽象的普通方法接口中的所有方法必须都是抽象的,不能有非抽象的普通方法;  
  • 3.静态成员变量抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。    
  • 4.静态方法:抽象类中可以包含静态方法,但不能是抽象静态方法;接口中不能包含静态方法(静态的方法不能被覆写)  
  • 5.构造方法(静态的):抽象类可以有构造方法,接口中不能有构造方法;
  • 6.方法访问权限:抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。 
  • 7.子类实现和继承: 一个类可以实现多个接口,但只能继承一个抽象类。  
编辑于 2021-05-08 08:36:55 回复(14)
总结一下
1. 一个子类只能继承一个抽象类,但能实现多个接口
2. 抽象类可以有构造方法,接口没有构造方法
3. 抽象类可以有普通成员变量,接口没有普通成员变量
4. 抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
5. 抽象类可以没有抽象方法,抽象类可以有普通方法,接口中都是抽象方法
6. 抽象类可以有静态方法,接口不能有静态方法
7. 抽象类中的方法可以是public、protected;接口方法只有public

发表于 2015-12-30 19:21:44 回复(5)
答案:ABCD
A,抽象类可以有普通成员变量,接口中只能有final类型的成员变量
B,都可以包含静态成员,这方面没有特殊规定
C,java是单继承的,就是只能有一个直接父类,但是可以实现多个接口
D,接口中只能声明方法,不能定义方法体,也就是方法都是抽象的。
编辑于 2016-02-26 11:16:58 回复(9)
抽象类的定义:
1.对于抽象的来说:抽象类必须有abstract修饰,只能用public 和默认修饰符修饰
2.对于抽象类的成员来说:抽象类中可以包含:
                                    (1) 成员变量(静态成员变量,非静态成员成员变量)、
                                    (2)构造方法(因为abstract定义的抽象类不能被实例化,那么抽象类中的构造方法作用是:继承抽象父类的的子类,在子类实例化时要调用父类的构造方法)
                                    (3) 成员方法(抽象方法,普通方法,静态方法。需要注意:抽象方法和普通方法只能用public ,protected,默认修饰。不能用private修饰,因为:private修饰与abstract一起使用无法方法重写)
                                   (4)初始化块
                                   (5)内部类

接口的定义:接口就是一个规定,没有为什么就是这样的。
1.对于接口这个来说:接口只能用public和默认修饰符修饰(与抽象类形同)
2.对于接口成员来说:
                                (1) 成员变量只能是静态成员常量(有人问不是可以不加修饰吗?比如在接口中加入int Max=0,可以实现这个接口并改变MAX值,可以发现这个值是不能改变的,也就是说系统会自动加上public static final 修饰符,如果是public static int Max = 0;系统也会自动改为静态常量,自己试过的。)
                                (2)没有构造方法,没有初始化块。
                                (3)成员方法
                                             (只能是 public修饰的 抽象方法 如果不加修饰符系统自动添加为public,因为自己加上default后不行,亲测
                                             (只能是默认修饰符修饰的普通方法)(必须用default修饰,没有default不行,系统不会自动添加,亲测)     
                                             (只能是public修饰的静态方法)(不加系统会自动添加为public)           

我这里很不清楚,自己总结一下,以后遇到这样的题就不能错!

最后简单总结一下其实抽象类就是普通的类里面可以添加的抽象方法,但是不能实例化了,记住这个就行!
                                而接口就是规定,必须记住!只能有静态常量,public修饰的抽象方法,普通方法是可以的但是必须是default修饰的,public修饰的静态方法也可以。 
当然还有很多没有说清楚:比如抽象类如果被另一个抽象类继承,那么子类抽象类可以不全部实现父类的抽象方法,
                                         抽象类与接口都在什么时候用?很多问题。。。。          
发表于 2016-07-26 12:29:04 回复(0)
不知大家对A有没有困惑  我来添加一个对A的解析:
        其实我们大家的脑子里 似乎模糊记得  接口中有成员变量啊    但是  事实不是的,接口中有的是public static final定义的常量!记住是常量!所以说有成员变量是错的
发表于 2016-09-05 21:08:28 回复(0)
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法,示例如下:
  1. interface Formula {
  2.      double calculate ( int a ) ;
  3.      default double sqrt ( int a ) {
  4.          return Math . sqrt ( a ) ;
  5.      }
  6. }
Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。
  1. Formula  formula   =   new   Formula ( )   {
  2.      @ Override
  3.      public   double   calculate ( int   a )   {
  4.          return   sqrt ( a *   100 ) ;
  5.      }
  6. } ;
  7. formula . calculate ( 100 ) ;       // 100.0
  8. formula . sqrt ( 16 ) ;             // 4.0

文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算 sqrt(a * 100)。

编辑于 2016-04-06 19:57:52 回复(0)
A选项一般都有问题吧,我感觉这里的普通与不普通主要体现在abstract中的成员变量不需要赋初值,interface中成员变量需要初始化
发表于 2016-02-10 16:08:23 回复(1)
总结了下:
1.8前:
  1. 抽象类有构造方法,接口没有
  2. 抽象类可以包含非抽象方法,接口不能,因为全都是默认public abstract的抽象方法!!
  3. 抽象类可以有普通成员变量,接口没有,因为都是public abstract final的常量!!
编辑于 2022-09-21 20:17:19 回复(0)
请考虑java中接口增加的default
发表于 2021-10-08 23:09:30 回复(0)
解析:抽象类和接口对比
1.成员变量:抽象类的成员变量无限制,接口的成员变量必须是public final static。
2.构造方法:抽象类可以有构造方法,接口不能有构造方法。
3.成员方法:抽象类有抽象方法,也可以有普通成员方法,接口只有抽象方法(jdk1.8后可以有default方法和static方法)。
发表于 2020-03-21 01:02:52 回复(0)
翻车在A选项,抽象类中可以有普通成员变量,但是接口中没有普通成员变量,因为接口里面没有构造器和代码块,因此接口里的成员变量只能在定义时指定默认值。
发表于 2019-09-12 16:03:01 回复(0)
总结一下
1. 一个子类只能继承一个抽象类,但能实现多个接口
2. 抽象类可以有构造方法,接口没有构造方法
3. 抽象类可以有普通成员变量,接口没有普通成员变量
4. 抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
5. 抽象类可以没有抽象方法,抽象类可以有普通方法,接口中都是抽象方法 public abstract(默认)
6. 抽象类可以有静态方法,接口不能有静态方法
7. 抽象类中的方法可以是public、protected;接口方法只有public
发表于 2018-10-28 15:38:35 回复(0)
厉害了 。。题中已标明jdk版本
发表于 2017-04-05 17:44:47 回复(0)
A.抽象类中可以有普通成员变量,接口中没有普通成员变量。(√)
接口的成员变量修饰符只能是 public,static,final (默认为 public static final ),成员方法修饰符只能是 public,abstract,default,static( 默认为 public abstract)。
发表于 2016-09-19 14:17:44 回复(0)
同上所说,1.8后接口里就可以有default方法了。
发表于 2016-07-12 11:16:23 回复(0)