1. 什么是抽象类?
在面向程序中,所有的对象都是通过类来描绘的,但并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描述一个具体的对象,那么这个类就是抽象类。
比如:
Animal是一个动物类,但Animal不是一个具体的动物,并不知道这个动物吃什么,所以Animal类中的eat方法无法具体实现。而Cat类,Dog类都是动物类,与Animal类是继承关系,两者都是具体动物,其内的eat方法可以实现 。因此Animal是一个抽象类。
2.抽象类的语法
Java中,抽象类需要被abstract修饰,而类中抽象的方法也需要被抽象,抽象方法不能给出具体的实现体。
//抽象类,被abstract修饰的类 abstract class Animal{ public int age;//属性 public String name; abstract public void eat();//抽象方法 public void a(){ System.out.println("普通方法"); } //构造方法 public Animal(int age, String name) { this.age = age; this.name = name; } } class Cat extends Animal{ @Override public void eat() { System.out.println(name + "吃鱼"); } }
抽象方法中也可以有普通方法和属性,甚至构造方法。
3.抽象类特性
3.1抽象类不能直接实例化对象
Animal animal = new Animal();//编译出错
3.2抽象方法不能被private修饰
abstract private void eat();//编译错误
3.3抽象方法不能被final和static修饰
1. abstract public static void eat();//编译错误 2. abstract final void eat2();
3.4抽象类必须被继承,子类需重写父类中抽象方法,否则子类也是抽象类,abstract
//抽象类,被abstract修饰 abstract class Animal{ public int age;//属性 public String name; abstract public void eat();//抽象方法 public void a(){ System.out.println("普通方法"); } public Animal(int age, String name) { this.age = age; this.name = name; } } class Cat extends Animal{ public Cat(int age, String name) { super(age, name); } @Override public void eat() { System.out.println(name + "吃鱼"); } } abstract class Dog extends Animal{ public Dog(int age, String name) { super(age, name); } }
3.5抽象类中不一定有抽象方法,但有抽象方法的一定是抽象类
3.6抽象类中可以有构造方法,供子类创建对象的时候,初始化父类成员变量
4抽象类的作用
抽象类就是起到一个校验代码的作用。抽象类本身不能被实例化,使用的时候,必须创建抽象类的子类,然后让子类重写抽象类中的抽象方法。细一看,不就是重写就能实现的吗,为什么还要进行抽象,这不是多次一举吗?
没错,这通过重写就能实现,但是并不多此一举。
在我们实际工作中使用抽象类,父类并不会被实例化,实际工作也不能由父类完成,而当我们实例化父类的时候,编译器就会报错,这样就能让我们提前发现问题,及时改正,避免最后在大量修改。