对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。
抽象类
普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。
那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。
而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
使用:
package com.wz.abstractdemo;
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
public class TestDemo {
public static void main(String[] args) {
A a = new A();
}
}
运行:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot instantiate the type A
at com.wz.abstractdemo.TestDemo.main(TestDemo.java:15)
接口
官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。
接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
接口定义举例
public interface Runner
int id = 1
public void start()
public void run()
public void stop()
}
两者的差别
1.语法层面上的区别
1>抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2>抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3>接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4>一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.设计层面上的区别
1>抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
1、接口中不能有构造函数,抽象类中可以有构造函数;
2、接口中只能有常量属性,抽象类中可以有一般属性;
3、接口中所有的方法都是public的,而抽象类中的方法可以被public、protect、default和private修饰
4、接口中所有的方法都是抽象的,不能有方法题,抽象类中可以有方法体;
5、接口中不能有静态方法(jdk1.8之后可以有静态方法,必须要有方法体),抽象类中可以有;
6、java支持多实现,但是只支持单继承;
7、抽象类中可以没有抽象方法