前面说一说定义,后面用自己的个人的通俗理解解释一下两者。
如果你已经明白了定义,可以直接到最后参考一下我的个人理解。
什么是抽象
- 抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。
- 这句话是百度百科中抽象的科学学概念。
- 由此可以说抽象即为提取一个事物本质的过程。
什么是抽象类
- 抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类
- 抽象类前加 abstract 修饰。
- 抽象类可以包含常规类能够包含的任何东西。
- 抽象类也可以包含非抽象方法,但不能在非抽象的类中声明抽象方法。
- 如果一个抽象类除了抽象方法以外什么都没有,则使用接口更合适。
声明一个抽象类:
public abstract class Shape{
// 实体
//抽象方法
//非抽象方法
}
什么是抽象方法
-
作为类修饰符,abstract声明了抽象类。
-
作为类方法修饰符,abstract声明了一种仅有方法头,没有具体的方法体和操作实现的抽象方法。
抽象方法声明的语法形式:
public abstract <returnType><methodName>(...);
//这里的方法体是不存在的
抽象方法的完成
- 抽象方法体的实现是由当前类的不同子类在他们各自的类声明中完成的。
- 就是说,我们一个子类继承了父类的抽象方法之后,再重写方法,形成若干个名字、返回值、参数列表相同但具体功能有所差别的方法体。
抽象方法的意义(优点)
- 隐藏具体的细节信息
- 强迫子类完成指定的操作
什么是接口
在前文抽象类的实现中我们有提到:如果一个抽象类除了抽象方法以外什么都没有,则使用接口更合适。
那么是不是可以说:接口是纯抽象的,在接口中是纯抽象方法,不规定方法的实体。
在接口中包含了数据成员,但是默认为static和final。
- 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
- 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
- 接口中的方法都是公有的。
此三点参考:菜鸟教程 Java接口
语法:
[接口修饰符] interface Name [<Type{,Type}>] [extends 父类名]{
...//方法的原型声明或静态常量
}
抽象和接口有何异同
抽象:
- 抽象类定义抽象方法,子类重写完成它。
- 比如定义一个People类,分别由皇帝,太监,文将,武将,皇后,舞女来做子类。
public abstract class People{
public void breath(){
Sysotem.out.println("呼吸");
}
public abstract double properity();
public abstract void hobby();
}
子类继承父类后,由于个人身份等原因,要重写抽象方法,呼吸是每个人都要的,并且不会因为皇帝的身份呼吸的就比别人快或者慢,所以我们可以定位为非抽象方法。
所以这里可以结合抽象的科学学概念,将抽象类理解为一个类的本质(具有的基础方法),那么定义一个抽象类就是定义一个类(事物)的本质。
接口
- 首先定义一个接口
public interface Wheel
{
int num = 4 ; //数据成员一定要初始化,可以省略static,final
double size(); //可以省略public,abstract
}
interface Color
{
void setColor(String color);
}
当我们用一个类去实现接口:
public class Car implements Wheel,Color{
...
}
这个时候可能你会发现有点不同,因为Car这个类实现了两个接口,但是继承的话却只能继承一个父类。
这个时候,就要来打个比方了。
抽象类和接口的不同
继承抽象类,要用到extends,被继承的抽象类叫做父类,也可以理解成为亲爹。
反之,接口的实现用implements,被实现的接口可以理解为干爹。
为什么只能继承一个父类和实现多个接口就一目了然了。
以下内容纯属个人理解:
- 小明出生了,那么他需要继承People类。
- 小明逐渐长大,学会了跳远,就实现了跳远的接口。
- 小明成年了,学会了怎么样去哄生气的女孩子,实现了哄女孩子的接口。
这些接口都是根据每个人不同的状态来进行重写的。
如果小明运动天赋高,那么在实现跳远的接口时可以重写到世界级的水平,反之重写为体侧不及格水平。
如果小明是情场高手,那么实现哄女孩子接口的时候就可以重写为顶级水平,反之为直男水平。