抽象类和接口的区别?

一. 基本概念的理解

      我们知道,接口被创造出来,主要是用来实现多继承的(c++是可以继承多个类的,java却不可以的)。 它通常定义了某一类的能力,当某个类implement这个interface,那么这个类就有了这个能力。举例,比如定义接口A,里面主要包括了飞的能力(其中具体为低飞,中空飞,高空飞),定义接口B包括了跑的能力(慢跑,中速跑,高速跑),定义接口C包括了游的能力(蛙泳,仰泳,蝶泳)。比如抽象类刘翔,因为他跑的快,所以我们就可以让它implement B;抽象类钢铁侠能跑能飞,我们就让他implement A ,B,比如抽象类超人能飞,能跑,能游,我们就让他implement A, B, C.
       而创造抽象类,主要是为了抽象对象的,特别是那些难以具体描述的对象,主要用来做基类 。比如狼和老鹰都是动物,他们都能移动,狼的移动方式是跑,而老鹰的移动方式是飞,如果抽象一个基类来给动物类建立模型,基类中的move()接口,就难以给出具体的函数体。

二. 结论:

根据个人的理解,加上参考部分资料,接口和抽象类的区别总结如下:
1. 抽象类是一个类,继承它用extends,并且只能单继承。
    接口只是一个接口,和类是不同的类型,实现它用implement, 可以多继承(这是java实现多重继承的一个大招)

2. 抽象类中的接口,可以有默认的行为。如果在抽象类中增加一个基本功能,那么所有的子类都可以直接用,而不
    需要改变子类实现。
    接口没有默认的实现。如果增加一个接口,那么需要子类实现它。

3. 抽象类中的方法或者变量可以用public, protected, default, private.
    而接口呢默认是public, 不允许用protected, default, private,使用public是多余的。

4. 从性能上说,抽象类快一点,因为它可能有默认的实现。而接口要慢一点,因为它总是需要需寻找接口的实现。

5. 抽象类中,可以写man方法,并且可以运行, 而接口却不可以。

如何选用接口和抽象类?

1.
首先看是否需要实现多继承,是就用接口(接口的最大功能就是用来实现多继承的)。

2. 再次就看”是一个“的问题(人是动物),还是”有一个“的问题了(人有跑的能力)。是的话就用虚拟类,有的话就用接        口。

3. 如果2分不清楚,就看是否需要默认的实现,有的话就用抽象类,没有就接口。

4. 如果通用的基本功能经常变,是就用抽象类,不是就用接口。

三. Demo显示

     写一个小Demo来验证下抽象基类和接口的的基本用法。首先写了一个抽象类Animals,其包括一个变量和三个基类方法(其中两个有默认方法),然后写了一个Person类,其继承于抽象类,复写了父类的所有方法。然后写一个了表示某能力的接口类,在Person中实现了它,最后,在主函数中new了Person对象,调用了所有的方法并给出了输出。
抽象基类:

public abstract class Animals {

    public String name;

    public void eat(){

        System.out.println("B:Abstract animals can eat!");

    }

    public void sleep(){

        System.out.println("B:Abstract animals can run!");

    }

    public abstract void printName();

}

接口定义:

public interface IHightTech {

    void playComputer();

    void Cook();

    void createPaper();

}

Person核心类:

public class Person extends Animals implements IHightTech {

    @Override

    public void printName() {

        System.out.println("Person name ="+name);

    }

    public Person(String str){

        name str;

    }

    @Override

    public void eat() {

        super.eat();

        System.out.println("S:Person can eat");

    }

    @Override

    public void sleep() {

        super.sleep();

        System.out.println("S:Person can sleep");

    }

    @Override

    public void playComputer() {

        System.out.println("I:Person can use computer");

    }

    @Override

    public void Cook() {

        System.out.println("I:Person can cook dinner");

    }

    @Override

    public void createPaper() {

        System.out.println("I:Person can create papter");

    }

}

主函数类:
public abstract class myClass {

    public static void main(String[] args){

        Person mPerson new Person("xiaoming");

        mPerson.printName();

        mPerson.eat();

        mPerson.sleep();

        mPerson.Cook();

        mPerson.createPaper();

        mPerson.playComputer();

    }

}

Output:
Person name =xiaoming
B:Abstract animals can eat!
S:Person can eat
B:Abstract animals can run!
S:Person can sleep
I:Person can cook dinner
I:Person can create papter
I:Person can use computer

 Process finished with exit code 0

四.总结

  最后,分别一句话总结下抽象基类和接口。接口是一种适用于多继承且,用来增加某种能力的一个类型。而抽象类是一种大致描述抽象对象的一种基类。当让,这只是我的个人认知,不到位的地方请大家多多指教。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值