java 抽象类和接口

抽象类                                                                                                               

  在java程序中,允许在定义方法时不写方法实体,这种方法被称为抽象方法,抽象方法必须使用abstract关键字修饰。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现

abstract void fun();

如果一个类中定义了抽象方法,则该类必须定义为抽象类,抽象类也同样使用abstract关键字修饰。

[public] abstract class ClassName {
    abstract void fun();
}

  注意包含抽象方法的类必须声明为抽象类,但是抽象类可以不包含任何抽象方法,只需要使用abstract关键字修饰即可。另外,抽象类不可以被实例化的,因为抽象类中可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想要调用抽象类中定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。

  由此,抽象类就是为了继承而存在的,如果定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来作任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就是abstract类了。

  包含抽象方法的类称为抽象类,但并不意味这抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。抽象类和普通类的主要有三点区别

  (1)抽象方法必须使用public或者protected(因为使用private,则不能被子类继承),缺省情况下默认为public;

  (2)抽象类不能用来创建对象;

  (3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。

 

接口                                                                                                                    

  在java中存在一种特殊的抽象类该类中只存在常量和抽象方法,而不存在变量定义和方法实现,这种特殊的类被称为接口。接口是由常量和抽象方法组成的特殊类,是对抽象类的进一步抽象。定义接口时需要使用interface关键字。

注意:在接口中常量默认使用了public static final修饰(并且只能使用public static final,使用private修饰会报编译错误),抽象方法默认使用了public abstract修饰

[public] interface InterfaceName { 
}

注意:在接口定义的的方法时,所有方法必须都是抽象的,所以不能通过实例化对象的方式调用接口中的方法。此时需要定义一个类,并使用implements关键字实现接口中的所有方法

class ClassName implements Interface1,Interface2,[....]{
}

  可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。

 

 接口和抽象类

 接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制(注意,该句中前后两个抽象类的意义不一样,前者表示的是一个实体,后者表示的是一个概念)。两只具有很大的相似性,但同时两者具有很大的差别。

  具体而言,接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法和私有变量的,如果一个类中包含抽象方法,那么这个类就是抽象类。在java语言中,可以通过把类或着类中的某些方法声明为abstract(abstract只能用来修饰类或者方法,不能用来修饰属性)来表示一个类的抽象类。接口就是指一个方法的集合,接口中所有的方法都没有方法体,在java语言中,接口就是通过interface来实现的。

  包含一个或者多个抽象方法的类必须声明为抽象类,抽象类可以声明方法的存在而不去实现他,被声明为抽象的方法不能包含方法体。在抽象子类中,实现方法必须含有相同或者更低的访问基本(public->protected->private)。抽象类在使用过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中所有的抽象方法提供具体的实现,否则他们也是抽象类。接口可以看作抽象类的变体,接口中所有的方法收拾抽象的,可以通过多接口来间接实现多重继承。由于抽象类可以包含部分方法的实现,所有,在一些场合下,抽象类比接口存在更多优势。

接口和抽象类的相同点:

  (1)都不能被实例化。

  (2)接口的实现类或者抽象类的子类都只有实现了接口或者抽象类中的方法后才能被实例化。

接口和抽象类的不同点:

  (1)接口只有定义,不能有方法的实现,而抽象类中可以有定义与实现,即其方法可以在抽象类中被实现。

  (2)实现接口的关键字为implement,继承抽象类额关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此没使用接口可以间接地达到多重继承的目的。

  (3)接口强调特定功能的实现,其设计理念是“has-a”关系,而抽象类强调所属关系,其设计理念是“is-a”关系。

  (4)接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,而且不许给其赋初值,其所有成员方法都是public、abstract的,而且主能被这两个关键子修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,而且,抽象类中的成员默认为default,当然也可以被定义为private、protected和public,而这些成员可以在子类中被重新定义,也可以被重新赋值,抽象类中的抽象方法(用abstract修饰)不能用private、static、synchronized和native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号{}。所以,当功能需要累计时,使用抽象类;不需要累计时,使用接口。

  (5)抽象类表示一个模板,假设人分学生和工人,学生和工人都可以说话,但是学生和工人说的话内容不一样,也就是说说话这个功能应该是具体功能,而说话的内容就要由学生或工人来决定了;接口表示一个标准,比如说”U盘和打印机都可以插在电脑上使用,因为他们都实现了USB标准的接口,对于电脑来说,只要符合USB接口标准的设备都可以插进来。

  (6)接口被运用与实现比较常用的功能,便于日后维护或者添加删除方法,而抽象类更倾向与充当公共类的角色,不适用于日后重新对里面的代码进行修改。

参考:

https://www.cnblogs.com/dolphin0520/p/3811437.html

2018-10-02 22:41:11

原文地址:https://www.cnblogs.com/qqiua/p/9738742.html