什么是抽象类?

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

为什么要用抽象类?

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

例一:普通类的继承

举个例子,假设一般的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. 如果一个类中有抽象方法,那么这个类必须是抽象类

Java中的抽象的更多相关文章

  1. 理解Java中的抽象

    在计算机科学中,抽象是一种过程,在这个过程中,数据和程序定义的形式与代表的内涵语言相似,同时隐藏了实现细节. 抽象:一个概念或者想法不和任何特定的具体实例绑死. 目录 什么是抽象 抽象的形式 如何在J ...

  2. Java中的抽象和封装

    一.面向对象和面向过程的区别 面向对象: 核心:封装了属性和方法的类,以数据为中心,实现了类级别的代码重用 面向对象因为采用了类,所以具有继承和多态特性,可以进一步重用代码和简化编程 面向过程: 核心 ...

  3. java中静态,抽象,接口,继承总结

    (一).静态: 1.静态方法里只能访问静态变量,静态变量是类所特有的,所有类实例都作用同一个变量 静态随着类的加载而加载 (二). 抽象:抽象相当于接口,没有方法体,只定义方法,让子类实现,抽象类中可 ...

  4. 【转载】JAVA中综合接口和抽象类实现的一种“抽象接口”

    Muscleape个人总结:(这里的抽象接口是指:使用一个抽象类实现一个接口,是两部分结构) 使用一个抽象类直接实现接口,将接口中的方法区分为实现类必须要实现的和选择性实现的,其他需要实现接口的类型通 ...

  5. Java中的继承、封装、多态、抽象

    1.继承 java 和某些面向对象语言(如 c++)在实现继承的不同之处在于java只支持单继承,不支持多重继承.即java 中一个类只能继承于另一个类.我们将被继承的类称之为父类(基类),继承类称之 ...

  6. Java 中的 I/O 抽象

    Table of Contents 前言 字节流 常用实现 字符流 常用实现 缓冲区 各种字节流 结语 前言 由于在接触 Java 之前使用的语言是 Python,所以在转到 Java 后对 Java ...

  7. java中的对象 方法 引用 等一些抽象的概念是什么意思呢?

    2020-03-14 最近这一段时间有点忙,好久都没有更新博客了,之后我会一直坚持下去的,和大家一同进步的. 这段时间一直在学java,相信刚开始学习java的小白,刚开始接触那么些抽象的概念一定和我 ...

  8. java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰

    1.abstract与static what abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用. static:用来声明静态方法,静态方 ...

  9. java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...

随机推荐

  1. struct与class的区别

    C++中的struct是对C中struct的扩充,它已经不再只是一个包含不同数据类型的数据结构,因为其扩充了太多功能.总的来说,C++中struct和class极其相似,比如,struct能包含成员函 ...

  2. 一对多关联模型,BELONGS_TO

    先分别创建三张表:test_user   test_message test_user 表里有id.name字段 test_message 表里有id.content.uid字段 然后建立一个Mode ...

  3. cadence16.6 暴力破解出现再次安装出现问题为Sever-----------问题

    根据本人,实测,本人研究几天和在网络上借鉴,此方法是几天的成果,如有借鉴,请说明出处,谢谢,不懂的请留言. 最优解决方式,是自己卸载软件,有人会说,都完全删除了还怎么卸载软件. (1)在安装包里有个注 ...

  4. 《图解HTTP》读书笔记(六:HTTP状态码)

    状态码的职责是当客户端向服务器端发送请求时, 描述返回的请求结果. 借助状态码, 用户可以知道服务器端是正常处理了请求, 还是出现了错误. 状态码类别 HTTP状态码由三个十进制数字组成,第一个十进制 ...

  5. Applet学习教程(一):applet+dwr 实现

    后台代码 import java.applet.Applet; import java.util.HashMap; import java.util.Map; import netscape.java ...

  6. 利用dladdr来获得so自身的路径

    #include <dlfcn.h> //定义该函数为了dladdr获取符号信息 void fun1() { } Dl_info info; //dladdr获取某个地址的符号信息 int ...

  7. python3.6安装docx模块

    1.下载 python_docx-0.8.6-py2.py3-none-any.whl 地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/2.在这个网页的最下 ...

  8. Python操作MongoDB看这一篇就够了

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...

  9. Ribbon标题语句

    感谢每一次成长的喜悦和感动,谢谢一路有你!我会比从前更爱你,希望     你能陪我走过这一生!网址:http://www.uc123.com/

  10. 微信公众平台开发教程(一)_微信接入校验以及token获取

    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础. 接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 ...