抽象其实也算面向对象特征之一
抽象
含义:当多个子类中的共性向上提取,父类中不知道如何写具体实现,因为提取的共性并不一定能解决子类中实现的功能【同结构不一定同实现代码体】,就需要抽象概念
作用
父类只抽取结构,不抽取实现,并且子类继承了父类之后,必须强制重写该结构
为什么需要用抽象类?
当多个子类存在公共特性的时候,会把它们公共的属性和行为向上提取,比如都提取了移动的方法,有跑、跳、滚、爬等等,但是该方法里面,不知道具体写什么,因为父类里面定义的代码,都是子类公共代码,虽然子类可以重写父类的方法,但是没有强制的约束,有些子类可能没有重写,那么调用移动的方法就会出现很大的问题
何为抽象类?
abstract 修饰的类
例:
public abstract class DemoAbstract {
类成员……;
}
抽象类里面的成员有哪些?
A、成员变量
B、构造方法
C、普通方法(包含静态/非静态方法)
D、抽象方法【先有抽象类,再有抽象方法;并且只有结构没有方法体】
例:
public abstract class DemoAbstract {
//成员变量
String name;
//无参构造
public DemoAbstract(){
}
//有参构造
public DemoAbstract(String name){
this.name = name;
}
//普通方法——静态修饰方法
public static void demoMethodStiatic(String name){
System.out.println(name);
}
//普通方法——非静态修饰方法
public void demoMethod(String name){
System.out.println(name);
}
//抽象方法
abstract void method();
}
如何调用?
在实际开发中,一般都是普通类去继承抽象类,从而普通类的实例化,进行方法的使用
注意事项
A、abstract修饰的类不能被实例化【虽然有构造方法,但是不能被实例化,否则直接编译错误】
B、抽象方法不能放到普通类里面,只能放到接口或抽象类中
C、抽象方法只能放到抽象类中,普通类继承抽象类,必须重写抽象类中的方法
如果是抽象类继承抽象类,不会强制重写基类抽象类中的方法
PS1:有继承关系,this对于成员变量和普通方法时,在当前类中找不到可以向上(父类)查找,但对于构造方法只能当前类查找,不能向上查找
PS2:@Override注解表示方法重写,专门用来验证方法是否重写成功了的
PS3:对于方法重写,final修饰的方法不能被子类重写