一. 基本概念的理解
我们知道,接口被创造出来,主要是用来实现多继承的(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