天天看点

JAVA初级(十四)抽象类介绍,抽象方法使用什么是抽象类?抽象类如何定义?abstract关键字抽象方法

本节介绍抽象类和抽象方法.

  • 什么是抽象类?
  • 抽象类如何定义?abstract关键字
  • 抽象方法

什么是抽象类?

一个类如果没有足够的信息来描述,那么它就应该被设计成抽象类.

因此可以说抽象类就是一个有这么个功能,但不清楚要如何实现的这么一个类.

比如有一个动物类,动物都有吃的动作,但每一种动物吃的方式可能不同.这种情况下动物类就应该被设计成抽象类

抽象类如何定义?abstract关键字

如下,设置一个抽象类就是public abstract class 类名就可以了

public abstract class Animal {
    public void eat(){}
}
           

申明成了抽象类就意味着这个类的功能不够明确,我们没有足够的信息来描述它,因此抽象类它不能被实例化.

public static void main(String[] args) {
  Animal animal = new Animal() ;//这样会直接报错提示abstract类不能被实例化
    }
           

所以我们就需要一个子类来实现它.比如我们创建一个鸟类继承动物类来实现这个吃的方法

public class Bird extends Animal{
    @Override
    public void eat() {//重写动物类的eat()方法
        System.out.println("鸟啄着吃");
    }
}
           

这样重写动物类的eat()方法,这是动物类的吃这个功能就被具体化了.有足够的信息来描述他了。因此这个时候就能实例化,但是要实例化实现了eat的那个类,也就是Bird

public static void main(String[] args) {
        Animal animal = new Bird() ;
        animal.eat();//这样就具体化了。
    }
           

总结:

1,抽象类不能被实例化,它直接被继承

抽象方法

上面的例子说到了动物的吃是一种抽象的行为,因为每一种动物的吃法都可能不同.但是代码上并没有体现出吃是一种抽象行为

比如

public class Bird extends Animal{
    @Override
    public void eat() {
        super.eat();//能调用animal类的eat(),说明了这个动物类的吃是具体的。
    }
}
           

因此抽象类有一个特殊组成,就是抽象方法.上面的eat()方法就应该是抽象方法.

抽象方法就是一个不知道具体行为,但又确实存在的一个行为,如过一个方法是抽象方法,那它在代码中体现出来就是我们直接调用Animal类的eat()应该要报错,因为我们不知道Animal的eat()行为.

抽象方法如何写?

public abstract class Animal {
    public abstract  void eat();//abstract修饰,没有大括号,直接分号
}
           

就这么写,用abstract修饰,去掉{}直接写分号.此时上面的super.eat()就会报错.会提示无法直接调用抽象方法,因为它是抽象的,我们不知道它的具体行为(代码中的表现就是没有方法体)

再看以下代码

public class Bird extends Animal{}//报错,提示必须重写父类的抽象方法
           

子类继承了父类,但没有去重写它的抽象方法,那就说明这个子类同样也是没有办法具体描述的,那么它也必须是抽象类

public abstract  class Bird extends Animal{}//编译通过
           

总结:

1,子类继承父类就必须重写父类的抽象方法,否则该类也必须声明为子类.

因为不这么做,你无法具体描述这个对象.

抽象类和抽象方法总结

1, 抽象类不能被实例化。只有抽象类的非抽象子类可以创建对象。

2. 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。

3.抽象类中的抽象方法没有方法体,就只是一个申明,需要子类继承并重写来实现它

4. 构造方法,static方法不能声明为抽象方法。

5, 子类继承抽象类,那么必须重写抽象类的抽象方法,否则该子类也必须申明为抽象类