在编程中,所有的对象都是用类来描述的,但并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个类,这样的类叫做抽象类。比如一个 new Shape(),都知道是一个形状,但是具体什么形状并不知道,只是一个抽象的概念。所以他是一个抽象类,具体的描述一个形状的时候,需要描述特征,才知道具体是什么形状。
抽象类:
抽象类是用来捕捉子类的通用信息,他不能被实例化,只能被当作子类的超类,抽象类是被用来创建继承层级里子类的模板。抽象类的方法可以有具体的实现,也可以申明自己的变量,但是变量必须是public,protected.
public abstract class Shape {
void draw(){
System.out.println(this + ".draw()");
}
abstract String tostring();
}
class Circle extends Shape{
@Override
String tostring() {
// TODO Auto-generated method stub
return null;
}
}
class Triangle extends Shape{
@Override
String tostring() {
// TODO Auto-generated method stub
return null;
}
}
接口:
接口interface是抽象方法的集合,如果一个类实现了某个接口,那么他就实现了这个接口的抽象方法,接口自身知识一种形式,接口不能做任何事情,也就是说所有的方法都是抽象的,并没有具体的实现,都为public。普通类要实现接口中的方法,要用implements 去实现。
public interface InterfaceShape {
//会报错,接口不会有具体的实现
// void draw(){
// System.out.println(this + ".draw()");
// }
void draw();
void remove();
String toString();
}
class Triange implements InterfaceShape{
@Override
public void draw() {
// TODO Auto-generated method stub
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
}
什么时候使用抽象类和接口:
1.如果你想拥有一些方法,并且想要一些默认的实现,那么就使用抽象类,接口不提供方法的具体实现。
2.抽象类是一个类,java类不支持多继承,子类不能继承多个类,但是子类可以实现多个接口,所以想要实现多重继承,必须使用接口。
3.接口中,方法的改变或者是增删都需要改变具体的实现类,抽象方法中除了抽象类,其余的方法都可以改变。
工作中具体的是使用场景:
游戏中的boss:boss可以分为多种,但是其中的攻击方法,奖励方法,通知场景中的玩家方法都相同,可以做成抽象方法,但是boss 具有想通的的属性,比如boss血量,bossid等; 那么就使用抽象类;
public abstract class AbstractBoss {
public int bossId;
protected long bossLf;
abstract void attract();
abstract void prize();
}