Java抽象类
public class Mammal {
public void move(){
System.out.println("aaaaaa");
}
}
public class Whale extends Mammal{
public void move() {
System.out.println("bbbbbbb");
}
}
public class Test {
public static void main(String[] args) {
Mammal mammal = new Whale();
mammal.move();
}
}
以上的代码就是以前多态学习中出现的代码,执行结果当然是bbbbbb。今天要讲的当然不是Java多态,而是另一个知识点抽象类。
抽象类是什么?
概念:通常在Java语句中用 abstract 修饰的类是抽象类。
为什么我们需要抽象类?
抽象类必须在多态的前提下,且我可以发现,父类的方法(move();
)是多余的,永远不会被执行。
则我们可以把父类的方法体去掉:
public abstract class Mammal {
public abstract void move();
}
没有方法体的方法就是抽象方法,需要用关键字abstract
修饰,而一个类中含有抽象类方法,则该类必须为抽象类,也就是abstract
修饰的类,如上代码所示。
抽象类的特点
- 类中含有抽象方法,则改类必须为抽象类。
- 抽象类可以没有抽象方法。
- 抽象类不能创建对象。
Mammal m = new Mammal(); //是会报错的
- 抽象类中抽象方法必须有子类实现(有子类去重写),如果没有实现或者没有实现父类所有抽象发,则改子类必须也为抽象类。
- 抽象类中可以有具体的方法。
public void eat() {
}
- 抽象类虽然不能创建对象,但是可以定义构造方法,该方法用于子类调用。
public Mammal() {
}
- 抽象类不能由final修饰,因为被final就不能有子类,所以前提就不满足了,就没有抽象类了。
Java接口
package 接口;
public abstract class Mammal {
public abstract void move();
}
package 接口;
public class Whale extends Mammal{
public void move() {
System.out.println("dddddd");
}
}
package 接口;
public class Test {
public static void main(String[] args) {
Mammal mammal = new Whale();
mammal.move();
}
}
- 接口的定义
因为抽象类中可以包含任意合法的方法;可以包含任意合法的成员变量;如果一个抽象类中只有抽象方法,则该抽象类可以定义为接口。使用interface定义接口;实现类通过implements关键字实现该抽象类中的抽象方法,代码如下:
package 接口;
public interface Mammal {
public abstract void move();
}
package 接口;
public class Whale implements Mammal{
public void move() {
System.out.println("dddddd");
}
}
接口的特点
- 子类没有实现完接口中所有方法,则该必须定义为抽象类.
package 接口;
public abstract class Whale implements Mammal{
}
- 接口不能创建对象,且接口中没有构造方法
Mammal mammal = new Mammal(); //会报错
public Mammal(){ //会报错
}
- 接口名常常I开头
- 接口中抽象方法默认为public abstract,所以接口中定义抽象方法时可以省略public abstract,只能为public abstract。
- 抽象类中可以定义任意合法的成员变量,但是接口只能定义public、static、final常量。
- JDK8以前版本的JDK中,定义的接口只能含有常量和抽象方法:JDK8 + 可以定义default或者static方法。
JDK12
public default void eat() { //是被允许的
}
public static void drink() {
}
JKD8以下的就不行,会报错。
例如JDK1.6
如何切换JDK版本
Java项目右键-Build Path-Configure Build Path…-Libraries-JRE System Library [JavaSE一1.6]-Edit-选择版本-Finish-Apply and Close
7. Java中类只能继承一个父类,但是Java接口可以继承多个接口,每个接口之间使用逗号隔开。
二者区别
- 定义:抽象类 abstract 接口interface
- 构造方法:抽象类有构造方法 接口没有构造方法
- 继承:抽象类只能单继承 接口可以继承多个接口
- 实现:抽象类型extends 接口implements
- 成员变量:抽象类可以定义任何合法的成员变量 接口只能定义public static final的变量即常量
- 方法:抽象类可以定义任意合法方法; 接口中只能定义抽象方法,JDK8.0+可以定义多个static或default修饰的具体方法