一、抽象类
抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明
抽象方法:没有方法体的方法,必须要使用abstract修饰
为什么要使用抽象类,抽象方法?
举例来说,如果你定义了一个类Person,此类中包含很多公共属性和方法。但是其中有一个方法,每个子类实现的方式都不同。比如“吃饭”这个方法,Child类中,“吃饭”使用勺子”,Adult类中,“吃饭”使用筷子。那么我们就在Person类中把这个方法定义好,就毫无意义。
public abstract class Person { //身高 public double height; //体重 public double weight; //年龄 public int age; //名字 public String name; //跑步 public void run() { System.out.println("==跑步=="); } //吃饭 public abstract void eat(); }
public class Child extends Person { //构造函数 public Child(String name, double height, double weight, int age) { this.height = height; this.weight = weight; this.name = name; this.age = age; } //无参构造函数 public Child() { } //吃饭 @Override public void eat() { System.out.println("==用勺子吃饭=="); } }
public class Adult extends Person { //构造函数 public Adult(String name, double height, double weight, int age) { this.height = height; this.weight = weight; this.name = name; this.age = age; } //无参构造函数 public Adult() { } //吃饭 @Override public void eat() { System.out.println("==用筷子吃饭=="); } }
抽象类与普通类的区别?
1)抽象类中的抽象方法必须声明为public或protected类型,如果声明为private或者friendly类型,子类不能继承使用,没有意义
2)抽象类不能创建对象,Person person = new Person();
3)如果子类继承了抽象类,则必须实现抽象类中的抽象方法。如果不实现,则必须将子类也声明为抽象类
二、接口
接口:在Java编程语言中是一个抽象类型,是抽象方法的集合
接口并不是类,虽然写法很相似。类描述对象的属性和方法,接口则包含类要实现的方法
接口表现的是一种能力,如果类实现了接口,表明这个类也具备了接口所要表现的能力
接口特性:
1)接口中的所有方法都是抽象方法,默认修饰符是public abstract(也只能是public abstract)
2)接口中也有变量,默认修饰符是public static final(也只能是public)
3)接口可以继承接口,而且可以多继承
三、抽象类与接口区别
语法区别:
1)抽象类中可以有非抽象方法,接口中的方法必须都是抽象方法
2)抽象类中的变量可以是各种类型的,接口中的变量只能是public static final类型的
3)抽象类中可以有静态代码块和静态方法,接口中不可以
4)一个类只可以继承一个抽象类,但是可以实现多个接口
设计区别:
抽象类是对一种事物的抽象,即对类抽象。而接口是对行为的抽象。
抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。
从这里可以看出,继承是一个 “是不是”的关系,而接口实现则是 “有没有”的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。