我爱学Java之接口和抽象类

对于面向对象编程来说,抽象是它的一大特征之一,而接口(interface)和抽象类(abstract)正是Java语言中支持抽象的两种机制。下面我就说一下两者的使用与区别:

抽象类是用关键字abstract修饰,抽象类在使用上与普通类没有什么区别,可以有自己的成员变量,成员函数,构造函数,唯一不同的是抽象类中可能包含0个或多个抽象方法并且不能被实例化(即不能通过new创建),即用abstract修饰并未定义实现的方法。换句话说,如果一个类包含一个或多个抽象方法,那么该类就必须限定为抽象类(否则编译器会报错),下面就是一个抽象类:

abstract class Father{
    private static int a = 1;
    static final int b = 2;
    protected int c = 3;
    public int d = 4;

    static{
        System.out.println("抽象类可以有静态块");
    }

    {
        System.out.println("抽象类可以有非静态块");
    }

    public Father(){
        System.out.println("抽象类可以有构造函数");
    }

    public void a(){
        System.out.println("抽象类可以有普通方法");
    }

    public static void b(){
        System.out.println("抽象类可以有静态方法");
    }

    //抽象方法不能用private修饰符
    //抽象类中也可以没有抽象方法,但没有实际意义,只会阻止创建该类对象
     abstract void d();
     protected abstract void e();
     public abstract void f();

}

如果一个类继承于抽象类,则需要实现抽象类的所有抽象方法,并且实现的抽象方法的可见性必须大于等于抽象类中的定义,如不能实现全部抽象方法,则子类也必须定义为抽象类。

class Son extends Father{

    @Override
    void d() {
        System.out.println("可见性还可以为protected和public");
    }

    @Override
    protected void e() {
        System.out.println("可见性还可以为public");

    }

    @Override
    public void f() {
        System.out.println("可见性还只可以是public");       
    }

}

接下来再说一下接口,接口是用关键字interface修饰,接口也允许创建者添加方法和域,但是具有一定的限定条件,方法只允许创建者确定方法名,参数列表和返回类型,不能够提供具体实现,同时在接口中定义的方法可见性默认为public;而域则被默认为public static final,下面是一个接口的定义:

interface Father{
    static final int a = 1;//默认为public static final
    void b();//默认为public
}

实现接口的类也必须实现接口中的所有方法,同时一个类也可以继承多个接口:

class Son implments Father1,Father2,...,Fahtern{
    ....
}

接口与抽象类的区别:

1.在使用及语法层面上的区别:

(1) 抽象类可以有默认方法的实现,而接口是完全抽象的,不存在方法的实现
(2) 抽象类可以有构造器,而接口没有构造器。
(3) 抽象方法可以有default,protected,public修饰符,而接口方法只能是public
(4) 抽象方法可以有main方法,我们可以运行他,而接口不能
(5) 抽象类可以继承一个类和多个接口,而接口只能继承接口
(6) 如果需要像抽象类中添加新方法,可以直接提供默认实现,而不用改变现有继承他的代码,而如果像接口中添加新方法,则需要修改现有代码。

2.从抽象及设计层面上的区别:

抽象类表示,这个对象是什么,是对事物的抽象,对根源的抽象,而接口则表示这个对象能做什么,是对动作的抽象,对行为的抽象。比如男人和女人都属于人,所有人属于一个抽象类,而人可以吃喝拉撒,动物也可以吃喝拉撒,但不能把动物归为人,而只能把行为抽象出来,即吃喝拉撒是一个接口。

所以可以根据上述两种层面上的区别,并结合实际的需求去选择到底应该使用接口还是抽象类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值