面向对象中所有的对象,都可以用类描述,但并不是所有的类都只能用来描述对象,若:一个类的信息不够时,它就属于“抽象类”。
那抽象类中究竟有哪些信息,或者又缺失哪些信息呢?
1、相同:成员变量/属性,方法(普通方法、构造方法),和访问方式与普通类并无特殊
2、不同:抽象类不能实例化对象。必须被继承。一个类只能继承一个抽象,可以有多个接口。
如果一个类包含有特别的方法,这个方法只能让继承他的子类实现,便可以在父类中声明“Abstract”,(这个类是抽象类)。
抽象方法,只包含方法名,不包含方法体(没有这东西),没有定义,方法名后边直接跟一个“()”,而不是“{}”。
如果类中有抽象方法,那这个类必然是抽象类,且子类必须重写父类的抽象方法,或声明自身是抽象类,最终,必须有子类实现抽象方法,否则将不能实例化对象。(只有抽象类的非抽象子类可以创建对象)
static修饰的方法,不能被定义成抽象方法;
下面用代码做个演示:
public abstract class Animal { //父类 int age; public abstract void rest(); //抽象方法,只包含方法名,不包含方法体(没有这东西),没有定义,方法名后边直接跟一个“()”,而不是“{}” public abstract void run(); public void shout(){ System.out.println("Animal.shout"); //普通/成员方法 System.out.println("一个抽象类中的父类普通方法"); } } class Dog extends Animal{ @Override public void rest() { System.out.println("Dog.rest"); //且子类必须重写父类的抽象方法,并!实现 } @Override public void run() { System.out.println("Dog.run"); //且子类必须重写父类的抽象方法,并!实现 } } class Cat extends Animal{ @Override public void rest() { System.out.println("Cat.rest"); //且子类必须重写父类的抽象方法,并!实现 } @Override public void run() { System.out.println("Cat.run"); //且子类必须重写父类的抽象方法,并!实现 } }
/** * 抽象类不能实例化,非抽象子类可以创建对象。属性、方法只能被子类调用。 */ class TestAbstractAnimal{ public static void main(String[] args) { Cat c=new Cat(); //(只有抽象类的非抽象子类可以创建对象) c.shout(); //抽象类内的信息,只能被子类调用 c.run(); } }