抽象类
先来了解抽象类的概念 : 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.
这样可能不好理解,我们可以举个例子,比如在自然界中有许多东西都是三角形的,但可以是直角三角形,广角三角形等等,因此我们可以将三角形写成一个抽象类,各种类型的三角形继承三角形这个父类的特性.
再举一个代码的例子,创建一个动物类
public class animal{
public void bark(){}
}
我们可以看到动物类中有一个方法,“bark()”
这时我们创建一个猫类(继承动物)
publi class cat extend animal{
public void bark(){
System.out.println("喵喵");
}
}
再创建一个狗类
publi class dog extend animal{
public void bark(){
System.out.println("汪汪");
}
}
我们可以从上述代码中可以看出,猫和狗类都对动物中的"bark()"方法进行了重写,那么就产生了一个问题,cat可以"喵喵"叫,狗可以"汪汪"叫,但动物怎么叫?很明显实例化一个动物类是没有任何意义的.
因此我们把动物类写成
public abstract class animal{
public abstract void bark(){}
当然这并不意味着在抽象类中就只能存在抽象方法
,抽象类和实体类的区别主要在于,
1.抽象类中的抽象方法只能用public或protected修饰.
2.抽象类不能创建对象,即不能实例化.
3.如果一个类继承于一个抽象类,那么子类必须实现父类的抽象方法.否则,子类继承的方法还是抽象方法,子类也变成了抽象类,要用abstract修饰.(类似于生物界中的分类,科下面有属,属下面有种)
接口
接口,英文interface,在软件工程中,接口泛指供别人调用的方法或者函数.从这里我们可以看到接口的主要目的是对行为的抽象.
接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法
.从这里我们可以看出抽象类和接口的不同了,接口更像是更加抽象的一种抽象类.
可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法.
区别
具体区别
1抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法.
2抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的.
3接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法.
4一个类只能继承一个抽象类,而一个类却可以实现多个接口.
当然这样不便理解,我们通过上述例子已经可以认识到抽象类是对整体的类的抽象,而接口是一种行为规范.
例如,鱼和船本身并没有太多共同点,但它们都有"游"这个特点,我们可以设计一个 swim接口,含swim()方法,鱼和船都可以根据需求实现这个方法,如果再增加船的种类,去继承船就行.
网上有一个很适合理解的代码例子,门和警报的例子
abstract class Door {
public abstract void open();
public abstract void close();
}
门类,包含"open()","close()"方法
interface Door {
public abstract void open();
public abstract void close();
}
门接口
我们这时要给门加一个警报方法"alarm()",
有两种解决方案,一种是给抽象类门加入"alarm()"
还有一种是给接口门加入"alarm()"
若采用第一种方案,则所有的门都会有警报功能,这与事实相悖了,采用第二种方案,那么所有有警报功能的类都要实现"open()“与"close()”,这也与事实相悖了,因为类如火灾报警器并不存在一个"开关"功能.
所以最好的思路便是把alarm单独写成一个接口,让有警报需求的类去继承它.
interface Alram {
void alarm();
}
abstract class Door {
void open();
void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}
希望对你有帮助
参考
http://blog.youkuaiyun.com/xw13106209/article/details/6923556
https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E7%B1%BB/4748292?fr=aladdin
https://www.jb51.net/article/122723.htm