在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类的特点
1.抽象类不能直接实例化
2.抽象类中可以有抽象方法也可以有非抽象方法
3.如果一个类中有了抽象方法,此类必需为抽象类
4.抽象方法带有强制性,要求子类必需重写,非抽象方法不带有强制性,子类可以继承也可以重写
5.抽象类存在构造方法,但是抽象类不能直接实例化,我们可以通过多态的形式间接实例化
6.抽象类中可以有成员变量也可以定义常量
7.抽象类的子类要么也是个抽象类,要么必需把抽象类中的所有抽象方法重写
abstract 不能与那些关键字共存
1.private 私有的无法继承,所以更不能重写,相互矛盾
2.final final不能重写
3.static 静态方法不参与重写,属于类
下面用抽象类来演示一个简单的程序
public class text {
public static void main(String[] args) {
Animal an = new Dog();
an.eat();
an.sleep();
an=new Cat();
an.eat();
an.sleep();
}
}
abstract class Animal {
int num = 1;
public abstract void eat();
public abstract void sleep();
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void sleep() {
System.out.println("猫白天睡觉");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void sleep() {
System.out.println("狗趴着睡觉");
}
}
执行上面的程序,结果如下
狗吃骨头
狗趴着睡觉
猫吃鱼
猫白天睡觉
总结
-
抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
-
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。