黑马程序员——Java基础---抽象类和接口的区别

来源:互联网 发布:java脚本返回上一页 编辑:程序博客网 时间:2024/05/16 05:46

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 

没有方法体的方法称为抽象方法,使用abstract关键字修饰,有抽象方法的类必须声明为抽象类,并且使用abstract关键字修饰,抽象类不能new对象,原因在于抽象类含有抽象方法,抽象方法中没有方法体,调用了没有意义,所以不能被调用。抽象类不一定含有抽象方法。 

抽象类与方法的定义格式:

abstract class 类名

{

abstract 返回值类型 方法名();//此处不可以定义方法体。

}

为什么要定义抽象类

如果有多个类具有相同的方法声明,而方法的实现不一样,这时就可以抽象出父类,将方法在父类中声明,当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取,只抽取功能定义,而不抽取功能主体,将抽取出的功能定义到抽象类中。抽象方法强迫继承父类的子类覆盖此方法。

抽象类的特点:

1,抽象方法一定在抽象类中。

2,抽象方法和抽象类都必须被abstract关键字修饰。

3,抽象类不可以用new创建对象。因为抽象方法中没有方法体,调用抽象方法没意义。

4,抽象类中的抽象方法要被使用,必须由子类覆写所有的抽象方法后,建立子类对象调用。

如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类,因为只要存在抽象方法的类就是抽象类,只覆盖部分抽象方法,则继承了另外的抽象方法,因此还是一个抽象类。

抽象类比一般类多个了抽象方法,抽象类不可以实例化,抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。抽象类是一个父类,要给子类提供实例的初始化,因此抽象类中也有构造函数。

被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。final与abstract不能共用。

Private修饰的类的方法,是私有的方法,不被子类所知,所以无法被复写同,而抽象方法出现的就是需要被复写。abstract与 private也不能同时出现。

Static修饰静态方法可以在没有创建对象的情况下直接用类名调用,但是,抽象方法中没有方法体,运行没有意义,因此,在同一方法中,Static与abstract不能共存。

接口可以认为是一种特殊的抽象类,接口中声明的所有方法都是抽象的,使用interface关键字修饰一个接口,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。

Class 用于定义类

interface 用于定义接口。

接口定义时的格式特点:

1.接口中常见定义:常量,抽象方法。

2.接口中的成员都有固定修饰符。

方法默认是公有的抽象的,被public abstract修饰

变量默认为全局常量,使用public static final修饰

3.接口中的成员都是public的。

接口的定义格式:

interface 接口名

{

public static final  变量类型 变量名 = ;//接口中可以没有变量

public abstract void 抽象方法名();

}

可简写为:

interface 接口名

{

 变量类型 变量名 = ;

 void 抽象方法名();

}

同时,为了便于阅读理解,通常用完整的代码定义接口。

接口是不可以创建对象的,因为有抽象方法,需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类。一个类实现接口,使用implements关键字

类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口,即多实现,也是对多继承不支持的转换形式。java支持多实现。接口与接口之间可以有继承关系,接口继承接口,使用extends关键字,接口支持多继承,接口不能继承抽象类,因为抽象类中可能有不抽象的方法。

抽象类(abstract class)和接口(interface)的区别

1.抽象类中可以有抽象的方法,接口中全是抽象的方法

2.抽象类用extends继承,接口用implements实现

3.抽象类中的变量和方法没有默认修饰符,接口中的变量默认为public static final的,接口中的方法默认为public abstract

4.一个类只能继承一个抽象类,一个类可以实现多个接口

定义抽象类与接口的时机

如果能用接口,就不用抽象类,因为别人实现接口可以不占用继承的位置。如果定义一个抽象的父类,其中所有方法都是抽象的,那么就定义为接口,需要有不抽象的方法,那么只能定义为抽象类,因为接口中的方法必须全是抽象的,抽象类中可以有非抽象方法。

 

0 0
原创粉丝点击