抽象
抽象方法:就是加上abstract关键字,然后去掉大括号,直至分号结束,必须存在于抽象类当中。
抽象类:抽象方法所在的类,在class之前写上abstract即可。
Demo:
public abstract class Animals{
//抽象方法
public abstract void method();
//抽象类,在抽象类中仍可定义一般方法
public void ff(){
System.out.println("这是一个一般方法!");
}
}
抽象方法和抽象类的使用:
注意:
1、不能直接创建new抽象类对象
2、必须要用一个子类来继承抽象父类。
3、子类(非抽象类)必须覆盖重写重写父类中的所有抽象方法。
覆盖重写(实现):子类去掉abstract关键字,然后补上方法体大括号。
可以通过@override来查看重写是否成功
4、当子类为抽象类时,不用抽象,但是可以加入进去新的内容,在使用时仍然需要重写,父类的所有抽象方法
Demo(抽象父类):
public abstract class AbstractMethod {
//抽象方法method1, method2
// 在使用时必须用子类继承,并在子类中重写所有的抽象方法
public abstract void method1();
public abstract void method2();
}
子类(非抽象子类):
public class AbstractMethod_Zi extends AbstractMethod{
//重写
@Override
public void method1() {
方法体
}
//@Override来检测是否重写成功,如果失败则会报错
@Override
public void method2() {
方法体
}
}
子类(抽象子类):
//在抽象子类中不需要重写抽象父类的抽象方法,但是抽象子类的子类必须重写所有的抽象方法
//也可以在抽象子类中新加入抽象方法和成员方法
public abstract class AbstractMethod_Zi_Abstract extends AbstractMethod{
//新加入的抽象方法
public abstract void Method3();
//新加入的成员方法
public void CommonMethod4(){
方法体
}
}
子类重写(非抽象类):
public class AbstractMethod_ReWrite_Zi extends AbstractMethod_Zi_Abstract{
@Override
public void Method3() {
方法体
}
@Override
public void method1() {
方法体
}
@Override
public void method2() {
方法体
}
}
实现类:
public class AbstractMethod_Main {
public static void main(String[] args) {
AbstractMethod_ReWrite_Zi one = new AbstractMethod_ReWrite_Zi();
one.method1();
one.method2();
one.method3();
one.CommonMethod4();
}
}
实现类运行结果:
抽象类方法1
抽象类方法2
抽象类方法3
普通方法
注意事项:
1、抽象类不能直接创建对象,如果创建编译无法通过而会报错,只能创建非抽象子类的对象。
2、抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
子类的构造方法中,有默认的super();来访问父类的无参数构造方法,如果父类中没有构造方法时,编译器会自动生成一个无参数的默认方法,如果写了有参数的构造方法时,则不会默认生成。此时,父类中没有无参数的构造方法,则编译器会报错。
3、抽象类中,不一定包含抽象方法,但是具有抽象方法的类一定是抽象类。
4、抽象类的非抽象子类,必须重写抽象父类中的所有抽象方法,否则,编译器会报错。