19.abstract class和interface有什么区别?

本文深入探讨了抽象类和接口在Java中的区别,包括它们的相同点与不同点,应用场合以及各自的优缺点。



19.abstract class和interface有什么区别?
1.相同点
  A. 两者都是抽象类,都不能实例化。
  B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

2. 不同点
  A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
  B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
  C. interface强调特定功能的实现,而abstract class强调所属关系。
  D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。
  这个选择有两点含义:
    一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。
    二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
  E. abstract class是interface与Class的中介。
  interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。
  abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

3. interface的应用场合
  A. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。
  B. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
  C. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
  D. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

4. abstract class的应用场合
  一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:
  A. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
  B. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
  C. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能

 


将以下哪种方法插入行3是不合法的。( ) 1.public class Test1{ 2.public float aMethod(float a,float b){ } 3. 4.} A. public float aMethod(float a, float b,float c){ } B. public float aMethod(float c,float d){ } C. public int aMethod(int a, int b){ } D. private float aMethod(int a,int b,int c){ } 2. 关于接口的声明,错误的是( ) 。 A. 接口中所有的成员属性都是public static final修订的常量 B. 接口中的成员属性在声明时可以省略修订关键字 C. 接口中所有的方法都是public abstract final修订的 D. 接口中所有的方法都是public abstract修订的 3. 下列关于使用包中的类哪个说法是正确的。( ) A. 类不可以使用其所在包中的private类 B. 类可以使用其他包中的所有类 C. 类可以使用其他包中的public类 D. 以上说法都不正确 4. 要产生[20,999]之间的随机整数使用哪个表达式? ( ) A. (int)(20+Math.random()*97) B. 20+(int)(Math.random()*980) C. (int)Math.random()*999 D. 20+(int)Math.random()*980 5. 为AB类的一个无形式参数无返回值的方法method书写方法头,使得使用类名AB作为前缀就可以调用它,该方法头的形式为( )。 A. static void method( ) B. public void method( ) C. final void method( ) D. abstract void method( ) 6. int型public成员变量MAX_LENGTH,该值保持常数100,则定义这个变量的语句是( )。 A. public int MAX_LENGTH=100 B. final int MAX_LENGTH=100 C. public const int MAX_LENGTH=100 D. public final int MAX_LENGTH=100 7. 下面的概念,哪个不是关于对象的多态性的体现。( ) A. 方法的重载 B. 方法的继承 C. 方法的覆盖 D. 对象的上、下转型 8. 关于接口,下面的叙述错误的是( )。 A. 一个接口可以多继承多个接口 B. 一个类可以实现多个接口 C. 抽象类在实现接口时,可以不实现该接口中声明的所有方法 D. 抽象类在实现接口时,必须实现该接口中声明的所有方法 9. 关于抽象类,下面叙述错误的是( ) 。 A. 包含抽象方法的类必须是抽象类 B. 抽象方法只需要声明,不需要实现 C. 抽象类可以实例化 D. 抽象类中可以没有抽象方法 10. 下列关于抽象类的说法哪一个是错误的( )。 A. 含抽象方法的类为抽象类 B. 抽象类能创建(new)实例 C. 子类有未实现父类的抽象方法时仍为抽象类 D. 子类实现所有抽象方法时不再是抽象类 11. 下列选项中,用于实现接口的关键字是 ( )。 A. interface B. implements C. abstract D. class 12. 下列选项中,用于定义接口的关键字是( )。 A. interface B. implements C. abstract D. class 13. 在Java中,能实现多重继承效果的方式是( )。 A. 接口 B. 继承 C. 内部类 D. 适配器 14. 下面哪个对类的声明是错误的( )? A. class MyClass extends MySuperClass1, MySupperClass2 {} B. public class MyClass{} C. abstract class MyClass implements YourInterface1, Youriterface2 {} D. private class MyClass {} E. class MyClass extends MySuperClass implements YourInterface {} 15. 下面说法不正确的是( ) A. 一个子类的对象可以接收父类对象能接收的消息; B. 当子类对象父类对象能接收同样的消息时,它们针对消息产生的行为可能不同; C. 父类比它的子类的方法更多; D. 子类在构造函数中可以使用super( )来调用父类的构造函数; 16. 在使用interface声明一个接口时,只可以使用( )修饰符修饰该接口。 A. private B. protected C. private protected D. public 17. 以下关于继承的叙述正确的是( )。 A. 在Java中类只允许单一继承 B. 在Java中一个类只能实现一个接口 C. 在Java中一个类不能同时继承一个类实现一个接口 D. 在Java中接口只允许单一继承 18. A派生出子类B,B派生出子类C,对于如下Java源代码正确的说法是()。 1.A a0 =new A(); 2.A a1 =new B(); 3.A a2 =new C(); A. 只有第1行能通过编译 B. 第1、2行能通过编译,但第3行编译出错 C. 第1、2、3行能通过编译,但第2、3行运行时出错 D. 第1行、第2行第3行的声明都是正确的 19. 若A1、A2为已定义的接口 ,以下接口定义中没有语法错误的是( ) 。 A. interface B { void print() { } } B. abstract interface B { void print() } C. abstract interface B extends A1,A2 { abstract void print(){ };} D. interface B { void print();} 20. Java中( ) 。 A. 一个子类可以有多个父类,一个父类也可以有多个子类 B. 一个子类可以有多个父类,但一个父类只可以有一个子类 C. 一个子类可以有一个父类,但一个父类可以有多个子类 D. 上述说法都不对 填空题 1. 1.使用this调用已有的有参构造方法,将width与length分别设置为56。 2.在Rectangle类中覆盖toString方法。按照width=实际宽度值,length=实际长度值的格式返回。 public Rectangle(){ } public Rectangle(int width, int length) { this.width = width; this.length = length; } public { } 2. 请写出以下程序运行结果: class Width { public static final int SINGLE = 1; } class Shape { public void draw(int Width) { System.out.println("Shape.draw()"+width); } } class Circle extends Shape { public void draw(Width n) { System.out.println("Circle.draw()"); } } public class Test { public static void test(Shape s) { s.draw(Width.SINGLE); } public static void main(String[] args) { Shape c = new Circle(); test(c); } } 3. 一个类如果实现一个接口,那么它就需要实现接口中定义的全部 ,否则该类就必须定义成 。 4. 定义在类中的变量被称为 ,定义在方法中的变量被称为 。 5. Java的三大体系分别是封装、 、 。 6. 请写出以下程序运行结果: class A { int x; String s; }; class HelloWorld { public static void main(String[] args) { A a= new A(); System.out.println(a.s); System.out.println(a.x); 判断题 1. 接口中的属性,都是静态常量。 正确 错误 2. 接口中的方法默认都是静态的。 正确 错误 3. 一个接口可以继承其他接口。 正确 错误 4. 一个类可以实现多个接口。 正确 错误 5. 类在实现接口的方法时,必须显式地使用public修饰符。 正确 错误 6. 如果一个类声明实现一个接口,但没有实现接口中的所有方法,那么这个类必须是abstract类。 正确 错误 7. 一个Java源文件就是由类接口组成的。 正确 错误 8. 接口中的常量默认是public static的变量。 正确 错误 9. 类在实现接口方法时必须给出方法体,并且一定要用public来修饰。 正确 错误 10. 为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。 正确 错误 11. 接口中的方法默认是public abstract方法。 正确 错误 12. 一个类只能有一个父类,但一个接口可以有一个以上的父接口。 正确 错误 13. 可以覆盖在父类中定义的私有方法。 正确 错误 14. 子类不继承父类的构造方法。 正确 错误 15. 对象是类的实例(instance)。 正确 错误 16. 在实例方法或构造器中,this用来引用当前对象,通过使用this可引用当前对象的任何成员。 正确 错误 17. 实例变量只能通过对象名访问,类变量既可以通过某个对象名也可以通过类名来访问。 正确 错误 18. 有的类定义时可以不定义构造函数,所以构造函数不是必需的。 正确 错误 19. 对于abstract类,不能创建该类的对象。 正确 错误 20. 如果一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。 正确 错误 21. 用static修饰的变量是类变量。 正确 错误 22. package语句必须放到java程序的最开始。 正确 错误 23. 类及其属性、方法可以同时有一个以上的修饰符来修饰。 正确 错误 24. 如果使用import语句引入了整个包中的类,那么可能会增加编译时间。但绝对不会影响程序运行的性能,因为当程序执行时,只是将真正使用的类的字节码文件加载到内存。 正确 错误 25. java.lang包是Java的核心类库,它包含了运行Java程序必不可少的系统类。 正确 错误 26. String字符串在创建后可以被修改。 正确 错误
最新发布
12-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值