Fork me on GitHub

JAVA中的抽象类与接口

一、类中声明一个方法,这个方法没有实现体,是一个空方法,这样的方法叫抽象方法,使用abstract修饰符号

当一个类有抽象方法时候,必须声明为抽象类

1.声明一个父类(父类类声明一个抽象方法,则父类必须声明为抽象类abstract修饰)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.子类一

1
2
3
4
5
6
7
8
9
10
package property;
public class ADHero extends Hero{
public void physicAttack(){
System.out.println("进行物理攻击");
}
@Override
public void attack(){//继承父类的同事,必须实现父类里的抽象类
physicAttack();
}
}

3.子类二

1
2
3
4
5
6
7
8
9
10
package property;
public class APHero extends Hero{
public void magicAttack(){
System.out.println("进行魔法攻击");
}
@Override
public void attack(){//继承父类的同事,必须实现父类里的抽象类
magicAttack();
}
}

二、类可以在不提供抽象方法的前提下,直接声明为抽象类。但是一旦被声明为抽象类,就不能狗直接实例化。

1
2
3
4
5
6
7
8
9
10
11
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的

1
2
3
4
5
6
7
package property;
public interface AD{
public static final int moveSpeed=100;
float hp;//hp没有显式声明为public static final,但是它默认就是这个
public void magicAttack();
int moveSpeed();//方法没有显式声明为public,接口中默认方法为public
}