Java中的抽象类和抽象方法(abstract)

抽象类

一、为什么要有抽象类?

想象一下,有一个父类Animal,子类有Dog,Tiger,Cat等等。我们实例化一个Dog类型orTiger类型的变量(即new Dog())看起来是很合理的事。但是!如果我们实例化一个Animal类型的变量,即new Animal(),是不是看起来有一点奇怪?Animal的实例化对象是什么?Dog是一条狗,Cat是一只猫,Animal是什么???

因此,我们发现有些类是不应该被初始化的。(即不应该存在被实例化的对象)

在本例子中,Animal就是抽象类,而Dog、Tiger和Cat这些都是具体类。

Fig.1 抽象类和具体类

二、设计抽象类

而在java中,要想让一个类不被初始化,只需要在类的声明前面加上关键字abstract即可。

abstract class Animal{
    public void roam();
}

抽象类代表没有人能够创建出该类的实例化对象,编译器不会通过。

三、抽象类声明引用变量

虽然抽象类无法实例化对象,但是抽象类仍然可以声明引用变量,抽象类只是无法实例化对象。

abstract class Animal{
    public void roam();
}

public class MakeAnimal{
    public void go(){
        Animal a;      //抽象类可以声明引用变量
        a = new Dog();
        a = new Cat(); //该部分涉及多态的内容
        a.roam();
    }
}

四、Tips

  1. 抽象类除了被继承以外,没有其他的用途和目的。
  2. 若继承了一个抽象类,就必须要实现该抽象类的所有抽象方法(非抽象方法可写可不写)。
  3. 抽象类中不一定有抽象方法。
  4. 但是有抽象方法的类一定是抽象类。
  5. 抽象类强制子类实现父类没有实现的功能,提高代码的复用性。
  6. final和abstract不能共存,final修饰的类不能继承、类中的方法不能重写。这与abstract修饰的类就是用来继承,方法就是用来重写的目的相悖。
  7. private和abstract不能共存,因为private修饰的类只能在本类中使用,与抽象类的作用相悖。

抽象方法

一、概念

抽象方法和抽象类一样,都是用abstract关键字修饰。它的特点在于抽象方法没有方法体:

public abstract void eat();  //没有方法体,直接结束

二、为什么要有抽象方法?

因为有时没有办法给任何子类都抽象出都有意义的共同程序代码。而抽象方法可以实现即使无法实现出方法的内容,但是仍然可以定义出一组子类共同遵守的协议。(即都要实现的方法,即使父类中没有方法体)

三、Tips

  1. 如果声明出一个抽象的方法,则必须将该类也声明为abstract,因为不可以在非抽象类中拥有抽象方法。就算只有一个抽象方法,也要将此类标记为抽象类。
  2. 抽象方法的好处是实现多态。
  3. 在继承树结构下的第一个具体类必须要实现所有的抽象方法。但是实现负担可以向下传递,例如第一级父类是abstract,第二级类仍然是abstract,则第二级类就不用实现抽象方法,直到具体类出现。
  4. 还记得抽象类既可以拥有抽象方法,也可以拥有非抽象方法吗?因此在3中说到的第二级abstract类也是可以去实现第一级abstract父类的抽象方法。这时出现的继承树下方的具体类就不必再实现第一级abstract父类的抽象方法。
  5. 必须实现所有抽象方法指的是:必须以相同的方法名、参数列表和返回值类型创建出非抽象的方法。(具体类中的方法体仍然可以是空的,尽管java很重视有没有实现这些方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m1m-FG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值