一、类中声明一个方法,这个方法没有实现体,是一个空方法,这样的方法叫抽象方法,使用abstract修饰符号
当一个类有抽象方法时候,必须声明为抽象类
1.声明一个父类(父类类声明一个抽象方法,则父类必须声明为抽象类abstract修饰)
package property; //为Hero增加一个抽象方法,必须把Hero声明为abstract。 public abstract class Hero{ String name; float hp; float armor; int moveSpeed; public static void main(String[] args){ } //抽象方法attack //Hero的子类会被要求实现attack方法 public abstract void attack(); }
2.子类一
package property; public class ADHero extends Hero{ public void physicAttack(){ System.out.println("进行物理攻击"); } @Override public void attack(){//继承父类的同事,必须实现父类里的抽象类 physicAttack(); } }
3.子类二
package property; public class APHero extends Hero{ public void magicAttack(){ System.out.println("进行魔法攻击"); } @Override public void attack(){//继承父类的同事,必须实现父类里的抽象类 magicAttack(); } }
二、类可以在不提供抽象方法的前提下,直接声明为抽象类。但是一旦被声明为抽象类,就不能狗直接实例化。
public class Hero extends Object{ String name; float hp; float armor; int moveSpeed; public static void main(String[] args){ //虽然没有抽象方法,但是被声明了抽象类,不能进行实例化操作。 Hero h=new Hero(); } }
三、抽象类和接口的区别
子类只能继承一个抽象类,也印证了java只能单继承
子类可以继承多个接口
抽象类可以定义为public,protected,package,private,有静态属性,非静态属性,final和非final属性
接口中的属性只能是public,静态,final的
package property; public interface AD{ public static final int moveSpeed=100; float hp;//hp没有显式声明为public static final,但是它默认就是这个 public void magicAttack(); int moveSpeed();//方法没有显式声明为public,接口中默认方法为public }