2018/01/08JAVA 基础 / 接口与继承 / JAVA 抽象类详解:修饰符“abstract"、抽象类与接口的区别
一、抽象类
抽象方法的定义:在类中声明一个方法,这个方法没有实现体,是一个“空”方法 ,这样的方法就叫抽象方法,使用修饰符“abstract" 。如下代码第18行为声明抽象方法。
抽象类的定义:当一个类有抽象方法的时候,该类必须被声明为抽象类,用public abstract class + 类名 进行声明。但抽象类可以在不提供抽象方法的前提下,声明为抽象类 。如下代码第3行为抽象类的声明:
1 package charactor; 2 3 public abstract class Hero {//声明抽象类 4 String name; 5 6 float hp; 7 8 float armor; 9 10 int moveSpeed; 11 12 public static void main(String[] args) { 13 14 } 15 16 // 抽象方法attack 17 // Hero的子类会被要求实现attack方法 18 public abstract void attack();//声明抽象方法 19 20 }
如下代码,一旦一个类被声明为抽象类,就不能够被直接实例化该抽象类。
1 package charactor;
2
3 public abstract class Hero {//声明抽象类
4 String name;
5
6 float hp;
7
8 float armor;
9
10 int moveSpeed;
11
12 public static void main(String[] args) {
13 //虽然没有抽象方法,但是一旦被声明为了抽象类,就不能够直接被实例化
14 Hero h= new Hero();//提示错误
15 }
16
17 }
抽象类中声明一个抽象方法时,抽象类的多个子类继承了抽象类的属性和方法,但这些子类必须提供父类中空体抽象方法不一样的实现。
二、抽象类与接口的区别
异:
1)子类只能继承一个抽象类,不能继承多个;子类可以实现多个接口
2)抽象类中的属性可以定义public,protected,package,private,静态和非静态,final和非final的属性;但是接口中声明的属性,即便接口中没有显示的声明public static final int i = 0,而是直接int i = 0,也只能是public、静态的、final的属性。代码案例如下:
1 package charactor; 2 3 public interface AP { 4 5 public static final int resistPhysic = 100; 6 7 //resistMagic即便没有显式的声明为 public static final 8 //但依然默认为public static final 9 int resistMagic = 0; 10 11 public void magicAttack(); 12 }
同: 抽象类和接口都可以有实体方法。接口中的实体方法,叫做默认方法。