一、抽象类
抽象类用来描述一种类型应该具备的基本特征与功能, 具体如何去完成这些行为由子类通过方法重写来完成。
- 抽象类往往用来表示对问题领域进行分析、设计中得出的抽象概念。其存在的意义在于其设计性、复用性与扩展性。
- 抽象类方便了具体类的定义。
- 抽象类仅是对功能和属性的声明,表示这类事物应该具备这些内容。限制程序员不能直接创建该抽象类对象,必须定义其子类才可使用。如我们可以听一只狼的叫声,也可以听一只狗的叫声,但是如果我们听一只犬科的叫声就显然不合适了。
简单说,概念的内涵越小,则其抽象程度就越高,其外延也越大,反之亦然。 比如“人”比“男人”抽象一点,而“生物”又比“人”更抽象一点,“物质”则比“生物”更抽象。
抽象类与普通类的区别:
- 抽象类必须用 abstract 修饰。
- 抽象类不能创建对象。
- 子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰。
- 抽象类默认的权限修饰符为 public,可以定义为 public 或 procted,如果定义为 private,那么子类则无法继承。
在面向对象的设计思想中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有描绘一个具体的对象,那么这样的类就是抽象类
抽象类和抽象方法的定义:
//抽象类员工
public abstract class Employee{
//抽象函数 需要abstract修饰,并分号;结束
public abstract void work();
}
public class Teacher extends Employee {
public void work() {
System.out.println("我是教师");
}
}
public class Assistant extends Employee {
public void work() {
System.out.println("我是助教");
}
}
public class Manager extends Employee {
public void work() {
System.out.println("我是管理员");
}
}
抽象类的特点:
- 只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。如果存留未实现的抽象方法则该子类仍为一个抽象类,无法创建对象。
- 抽象类不一定包含抽象方法。
- 抽象类可以有非抽象方法。
- 抽象类拥有构造方法,其存在的意义在于对自身进行初始化,供其子类使用。
二、接口
接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为。
一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口的特点:
- 接口中的变量隐式的使用 public static final 修饰,并且需要给出初始值。
- 方法隐式的使用 public abstract 修饰(并且只能是 public ,如果是 private,procted,那么就编译报错)。
- 接口中的变量必须用 public static final 修饰,并且需要给出初始值。所以实现类不能重新定义,也不能改变其值。
- 接口中的方法默认是 public abstract,也只能是这个类型。不能是 static,接口中的方法也不允许子类覆写,抽象类中允许有static 的方法。
接口的定义:
在程序的开发中,需要完成两个数的求和运算和比较运算功能的类非常多。那么可以定义一个接口来将类似功能组织在一起。下面创建一个示例,具体介绍接口的实现方式。
public interface IMath{
public int sum(); //完成两个数的相加
public int maxNum(int a,int b); //获取较大的数
}
定义一个 MathClass 类并实现 IMath 接口,MathClass 类实现代码如下:
public class MathClass implements IMath{
private int num1;
private int num2;
public MathClass(int num1,int num2){
//构造方法
this.num1=num1;
this.num2=num2;
}
//实现接口中的求和方法
public int sum(){
return num1+num2;
}
//实现接口中的获取较大数的方法
public int maxNum(int a,int b){
if(a>=b){
return a;
}else{
return b;
}
}
}
三、抽象类和接口的区别
相同点:
- 都不能被实例化。
- 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点:
抽象类 | 接口 |
---|---|
public abstract class 类名{ } | public interface 类名{ } |
extends 关键字 | implements 关键字 |
只能实现一个抽象类 | 可以实现多个接口 |
关注一个事物的本质 | 关注一个操作 |
强调所属关系 | 强调特定功能的实现 |
接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。
- 抽象类和具体实现类之间是一种继承关系,也就是说如果釆用抽象类的方式,则父类和子类在概念上应该是相同的。
- 接口却不一样,如果采用接口的方式,则父类和子类在概念上不要求相同。接口只是抽取相互之间没有关系的类的共同特征,而不用关注类之间的关系,它可以使没有层次关系的类具有相同的行为。
- 因此,可以这样说:抽象类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。