Java中的抽象

什么是抽象类?

如果一个类没有足够的信息去描述一个具体的对象,那么这样的类我们就称它为抽象类。这很好理解,就如同动物是一个很广泛的概念,由于在动物这个类里,我们无法用很详细的信息去描述狗狗这个具体的对象。所以,动物类就是抽象类,而狗、猫这些真实存在的物种,就是具体的对象。

为什么要用抽象类?

定义抽象类就是用于继承的。和一般类的继承相比,子类继承抽象类必然会实现抽象方法。由于抽象方法都是没有方法体的,也就是说,抽象方法并没有写死,我们可以根据自己的需求去写。这样就很灵活、方便。

例一:普通类的继承

举个例子,假设一般的Animal类里有个方法run(),方法体是“四条腿跑得真快”,Fish这个类继承Animal类。此时我们不仅需要手动重写run方法,而且还要改写方法体,不然直接打印的结果就是“四条腿跑得真快”。然而,鱼有腿吗?所以我们需要把下面代码中的super.run手动删掉,并改写方法体为“游得真快”

public class Animal {
    public  void run(){
        System.out.println("四条腿跑得真快");
    }
}

public class Fish extends Animal {
    @Override
    public void run() {
        super.run();       
        //改写
        System.out.println("游得真快");
    }
}

public class Test {
    public static void main(String[] args) {
        Fish fish = new Fish();
        fish.run();
    }
}

四条腿跑得真快
游得真快

例二:抽象类的继承

由于抽象类中的抽象方法没有方法体,因此子类继承抽象类的时候会自动实现抽象类中的方法,即不用我们自己书写,会自动帮我们重写。我们只需改写即可。和普通类的继承相比,抽象类是不是更方便,更简洁?

public abstract class Animal {
    public abstract void run();
}

public class Fish extends Animal{

    @Override
    public void run() {
        System.out.println("游得真快");
    }
}
public class Test {
    public static void main(String[] args) {
        Fish fish = new Fish();
        fish.run();
    }
}
游得真快

抽象类的特点

  1. 用abstract修饰
  2. 不能实例化对象
  3. 如果子类继承抽象类,那么子类必须实现抽象类(重写抽象类中的抽象方法)
  4. 如果子类不想实现抽象类,那么子类也必须得是抽象类才行(加上abstract修饰)

理解抽象类

  1. 抽象是相对于具体而言的,比如张三、李四是具体的,那么人这个统称是抽象的。狗、猫是具体的,动物这个统称是抽象的。橘子、苹果是抽象的,水果这个统称是抽象的。
  2. 抽象,用一句话来说就是,先提炼归纳出一些事物的本质,然后将这些事物的共有属性归结为一个统称的过程。
  3. 抽象类,就是拥有一些事物共同属性的类。如铅笔、橡皮、胶带,我们可以用一个文具类进行表示
  4. 抽象类不能被实例化,因为我们无法直接从这些共性中生出个性。就如同饮料类,你说new出来饮料的是雪碧还是冰红茶?加上抽象方法没有方法体,你实例化后调用它根本没有任何意义。sun公司考虑到这一点,同时也为了代码规范,干脆不让你new了,因此当你new抽象类的时候,会强制报错。不过我们可以通过匿名内部类解决,这个后期再讲。
  5. 动物有天上飞的、地上跑的、水里游的,动物有不同的类别,这就做多态。这些飞鸟、游鱼、走兽,虽然外观习性都不同,但本质上都是动物,因此动物这个类就是抽象类。所以我们可以得出这样的结论,抽象类的目的就是实现多态中的共同点。

抽象方法的特点

  1. 用abstract修饰的方法
  2. 抽象方法没有方法体,即方法名后面没有{}
  3. 必须由子类重写

抽象类和抽象方法的关系

  1. 抽象类中可以没有抽象方法,但这相当于废物类了
  2. 如果一个类中有抽象方法,那么这个类必须是抽象类
posted @ 2019-04-25 15:04  爱听音乐的猪  阅读(224)  评论(0编辑  收藏  举报