如果一个类没有足够的信息来描绘一个具体的对象,这样的类就是抽象类
一、抽象类语法
在Java中,如果一个类被abstract修饰则称为抽象类,抽象类中被abstract修饰的方法称为抽象方法。抽象方法不用给出具体的实现体
注:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
以下代码加深理解:
//Animal就是抽象类
//注意:抽象类也是类,也可以有成员方法,成员变量,构造方法和代码块
public abstract class Animal {
protected String name;
protected String gender;
protected int age;
public Animal(String name,String gender,int age){
this.name = name;
this.gender = gender;
this.age = age;
}
{
System.out.println("实例代码块");
}
static{
System.out.println("静态代码块");
}
//被abstract修饰的方法就是抽象方法,这些抽象方法将来要在其子类中被重写
public abstract void sleep();
public abstract void eat();
public abstract void bark();
}
二、抽象类特性
1、抽象类不能直接实例化对象
注:包含抽象方法的类就是抽象类,不是说抽象类中必须有抽象方法,只要类被abstract修饰了,就是抽象类
2、抽象方法不能是private的
3、抽象方法不能被final和static修饰,因为抽象方法要被子类重写
4、抽象类必须被继承,并且继承后子类要重写父类的抽象方法,否则子类也是抽象类,必须要使用abstract修饰
以下代码加深理解:
public abstract class B {
public void func(){
System.out.println("func");
}
public abstract void method0();
public abstract void method1();
abstract void method2();
protected abstract void method3();
}
public class D extends B{//抽象方法重写完
@Override
public void method1() {
}
@Override
public void method0() {
}
@Override
void method2() {
}
@Override
protected void method3() {
}
}
public abstract class D1 extends B{//抽象方法没有重写完
@Override
public void method1() {
}
@Override
void method2() {
}
@Override
protected void method3() {
}
}
5、抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
6、抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
三、抽象类的作用
抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。
使用抽象类的场景就如上面的代码,实际工作不应该由父类完成,而应该由子类完成,那么此时如果不小心误用成父类了,使用普通类编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。
很多语法的出现都是为了预防出错。