java基础梳理:抽象类与接口

  接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
 
  抽象类是普通的类与接口之间的一种中庸之道。尽管在构建具有某些未实现方法的类时,你的第一想法可能是创建接口,但是抽象类仍旧是用于此目的的一种重要而必须的工具。因为你不可能总是使用纯接口。
                                                                                                                      ------------------《Thinking in Java》

一 、抽象类
  类描述了具有相同特性(数据元素)和行为(功能)的对象集合,但并不是所有的类都是用来描述对象的。
  如果一个类没有足够的信息来描述一个具体的对象,仅仅描述了一些通用方法,需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。

   比如,我们写个程序简单描述wind(管乐)和stringed(弦乐)的演奏,我们可以创建一个Instrument(乐器)基类,创建Wind类和Stringed类继承于基类。
 
class Instrument{
    public void play(){
        System.out.println("Instrument play");
    }
}
class Wind extends Instrument{
    public void play(){
        System.out.println("Wind play");
    }
}

class Stringed extends Instrument{
    public void play(){
        System.out.println("Stringed play");
    }
}

public class Music{
    public static void main(String[] args){
        Instrument w = new Wind();
        Instrument s = new Stringed();
        w.play();
        s.play();
    }
}
/**output:
*Wind play
*Stringed play
*/
在这个示例中,Instrument类的目的是为它的所有导出类创建一个通用方法。建立这个通用方法的唯一理由是:不同的子类可以用不同的方式表示此方法。通用方法建立起一种基本形式,以此表示所有导出类的共同部分。我们可以将Instrument类称作抽象基类。
     可以看出如果我们只有一个像Instrument的抽象基类,那么该类的对象几乎没有任何意义。我们只是希望通过这个通用方法操纵一系列类,Instrument类只是表示了一个方法,没有具体的实现内容,因此,创建一个Instrument对象没有什么意义,并且我们可能还想阻止使用者这样做。通过让Instrument中的所有方都产生错误,就可以实现这个目的。

  为此,Java提供了抽象方法机制,该方法是不完整的,仅有声明而没有方法体。语法如下:abstract void f();

  包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的,否则编译器就会报错。

  编译器会保证抽象类的纯粹性,为抽象类创建对象会从编译器那里得到一条出错信息。

    如果从一个抽象类继承,并想创建该新类的对象,那么就必须为基类中的所有的抽象方法提供方法定义。如果不这样做(可以选择不做),那么导出类也是抽象类,且编译器将会强制我们用abstract关键字限定这个类。

   我们也可以创建一个没有任何抽象方法的抽象类,如:有一个类,让其包含任何abstract方法都显得没有实际意义,而且我们也想阻止产生这个类的任何对象。
  因此,我们可以将上面例子中的Instrument类转化为abstract类,将play方法转化为抽象方法:
abstract class Instrument{  
  public abstract void play();  
}  
创建抽象类和抽象方法可以使类的抽象性明确起来,并告诉用户和编译器打算怎样来使用它们。

二、接口

    Interface关键字使抽象的概念更向前迈进了一步。 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。interface关键字产生一个完全抽象的“类”(类似类的形式而已,并不是类),它根本就没有提供任何具体实现,它允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。
   一个接口表示:“所有实现了该特定接口的类看起来像这样”。因此,任何使用某特定接口的代码都知道可以调用该接口的哪些方法,而且仅需知道这些。接口被用来建立类与类之间的协议。
  要想创建一个接口,需要用interface关键字来代替class关键字。接口也可以包含域,但是这些域隐式是static和final的。
  要让一个类遵守某个特定接口(或者是一组接口),需要使用implements关键字,它表示“interface只是它的外貌,但是现在我要声明它是如何工作的。”
  当要实现一个接口时,在接口中被定义的方法必须被定义为是public的。(否则,它们将只能得到默认的包访问权限,这样在方法被继承的过程中,其可访问权限就被降低了,这是java编译器所不允许的)
    在接口中的任何方法没有声明为public的话,它们自动就是public的。
  接口使得java可以实现类似“多重继承”的功能。

三、总结
抽象类与接口的相同点:
1.二者都是继承树的上层,都是上层的抽象层
2.二者都不能被直接实例化。如果抽象类要实例化,需要有子类继承这个抽象类并实现了这个抽象类的所有抽象方法。如果接口要实例化,需要有子类实现了这个接口所有的方法。
3.二者都能包含抽象的方法,这些抽象的方法用于描述类具备的功能。

抽象类与接口的不同点:
1.接口只能对抽象的方法进行声明,抽象类既可以对抽象的方法进行声明也可以对抽象的方法进行实现。
2. 抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。当你关注事物的本质的时候,用抽象类;当你关注一种操作的时候,用接口。
3.一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值