Java中抽象类和接口的特点以及区别

抽象类

(在了解抽象类之前一定要先了解抽象方法。抽象方法是一种特殊的方法:他只有声明,没有具体实现。)

抽象方法的声明定义:

```
修饰符 abstract  返回值类型 方法名(); 
```
  • 抽象方法必须用abstract关键词进行修饰声明!如果一个类中含有抽象方法,则称这个类为抽象类(也就是说抽象类中也有普通方法的)。
  • 抽象类则必须在类前面加上abstract关键词修饰。需要注意的是,抽象类中有的方法一定是抽象的(这个我其实还不是很懂!因为没有抽象方法的类也可以是抽象类,比如MouseAdapter抽象类,没有抽象方法,都是没有方法体的方法。所以我觉得吧,只要没有方法体的方法都可以视作抽象的方法(用于定义抽象类),并不一定要是“抽象方法” ),但是抽象方法并没有具体的方法体去“形容”一个对象,所以<font color="red">抽象类不能实例化对象</font>(更偏激的情况就是抽象类中全是抽象方法,更无法实例化对象)。

抽象类的声明定义:

```
修饰符 abstract class 类名 {
    类体
}
```
  • 那么定义了这个抽象类好像什么也干不了啊!Java面对对象编程,可是抽象类都不能实例化对象,不能做任何事,岂不是白白浪费了声明的这个类了吗。可是并不是,最后一条退路就是继承!甚至可以看出抽象类就是为了继承而存在的(所以也不要纠结一个抽象类是否有抽象方法了,就记住他是为了继承存在的吧)。
  • 对于一个父类,如果他的某个方法在父类中是实现没有任何意义,必须根据子类的需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,类也就成为了abstract类。

显而易见的是抽象类中不止有抽象方法,它和普通类相同,一样可以拥有成员变量和普通方法。抽象类和普通类的区别主要是:

  •      抽象方法修饰符必须是public或者protected(因为private不能被子类继承),缺少的情况默认为public
  •      抽象类不能创建对象
  •      如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

其他的都和普通类一样。


总结一下抽象类的特点:

  • 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象
  • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
  • 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能
  • 构造方法,类方法(用static修饰的方法)不能声明为抽象方法
  • 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
     


接口(关于接口的内容想要知道具体实例,可以看监听类MouseAdapter,以及其实现的接口,还有接口实现的接口

接口的声明定义

```
访问修饰符  interface  接口名  [extends 其他的接口名名] {
        // 声明变量
        public static final 属性类型 属性;
        // 抽象方法
        public  void  方法名();
}
```

接口的实现方法

```
类名  implements  接口1名称, 接口2名称, 接口3名称···
```
  • 接口的定义需要使用 interface,接口的实现需要用到 implements 。 但是需要注意的时,当一个类实现接口的时候,必须要实现(也就是重写)接口中所有的方法,否则该类必须要声明为抽象的类
  • 接口的属性和方法都是公有,因此访问修饰符是  public
  • 接口里面有属性和方法,也可以只有属性(比如定义写五子棋时定义的变量接口),也可以只有方法(比如鼠标监听MouseListener),也可以啥都没有(比如鼠标监听继承实现的接口EventListener)。
public interface Config {
    //只有属性的接口
    public static final int xo = 30;
    public static final int yo = 30;
    public static final int rows = 16;//横向线条数
    public static final int columns = 16;//纵向线条数
    public static final int chesssize = 40;//棋子直径
    public static final int size = 50;//单元格大小
}

public interface MouseListener extends EventListener {
    //只有方法的接口
    public void mouseClicked(MouseEvent e);
    public void mousePressed(MouseEvent e);
    public void mouseReleased(MouseEvent e);
    public void mouseEntered(MouseEvent e);
    public void mouseExited(MouseEvent e);
}

public interface EventListener {
    //其实这个接口里面什么都没有
}


 

  • 接口只能由接口继承,类似于类的继承,比如鼠标监听。然而,接口可以实现**多继承**
     
```
public interface MouseListener extends EventListener {
    //方法
}

public interface Hockey extends Sports, Event {
    //方法
}
```

这里稍微提一下没有任何属性和方法的接口,这种接口称为标记接口。 那么这种接口有什么用呢?简单的来说,就是Java给这个接口盖了个戳,给了他一些特权。比如接听接口继承的

```
public interface EventListener {
    //这里真的是空的,不信你去查源代码
}
```


标记接口的两种主要目的:

  • 建立一个公共的父接口

        正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

  •  向一个类添加数据类型

        这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

抽象类、接口的相似、区别

相似之处:

  • 都不能被实例化
  • 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)
  • 都含有未实现的方法声明(我还是有疑问,就是不含有抽象方法的类,也tm可以是抽象类啊!!!那么这点就作废)


区别之所:
(抽象类与接口紧密相关。然而接口又比抽象类更抽象,这主要体现在它们的差别上 )

  • 类只能继承一个抽象类,但可以实现很多个接口(可以看出接口就是为了解决单继承出现的吧)
  • 抽象类可以存在抽象方法和普通方法,但是接口不行啊,接口只能存在  public  修饰的方法,而且没有方法体
  • 抽象类的变量可以各种修饰符来修饰,但接口的成员变量是默认的静态常量(static  final
  • 抽象类是一种特殊的类,而接口只是一种规范
  • 抽象类是对 对象 的抽象,而接口是一种行为规范。(打个比方,人是一个抽象类,有两个派生类(也可以是抽象的)分别是男人和女人。但是人吃饭的方式方法有很多种,比如说用刀叉,用筷子,这就是接口


 

猜你喜欢

转载自blog.csdn.net/weixin_42621338/article/details/82832182