抽象类的基本概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static 方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。

那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。

而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。

而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。

举例说明:

从上可知,A 是抽象的,无法直接进行实例化操作。为什么不能直接实例化呢?

因为当一个类实例化之后,就意味着这个对象可以调用类中的属性或者方法了,但在抽象类里存在抽象方法,而抽象方法没有方法体,没有方法体就无法进行调用。

既然无法进行方法调用的话,又怎么去产生实例化对象呢。

抽象类的使用原则

1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类 便无法实现该方法),缺省情况下默认为public;

(2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理,形如:Parent p = new Child();;

(3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;

(4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现 父类的抽象方法,则必须将子类也定义为为abstract类。);

下面写个小例子:

注意:虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类。

抽象类的使用限制

(1)抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。

(2)抽象类不能使用final声明 ,因为抽象类必须有子类,而final修饰了类之后就不能被其它类继承了。

(3)抽象类是不能使用static声明的。

(4)任何时候,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样。

抽象方法

如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。

Abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

方法名后面直接跟一个分号,而不是花括号。

举例说明:

声明抽象方法会造成以下两个结果:

如果一个类包含抽象方法,那么该类必须是抽象类。任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。那么这个抽象父类到最终的子类都不能用来实例化对象。

举例说明:

那么这样salary重写了Employee中的show方法,这样父类的引用指向了子类对象。

抽象类总结

抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。

抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

构造方法,类方法(用static修饰的方法)不能声明为抽象方法。

抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

抽象类是有构造方法的,但是不能实例化。

java 幻影_Java之抽象相关推荐

  1. java工厂模式和抽象工厂_Java中的抽象工厂设计模式

    java工厂模式和抽象工厂 Welcome to Abstract Factory Design Pattern in java example. Abstract Factory design pa ...

  2. 为什么静态方法在Java中不能是抽象的

    本文翻译自:Why can't static methods be abstract in Java The question is in Java why can't I define an abs ...

  3. 当Java代码遇上抽象、重载加重写,一切都不美好了

    当Java代码遇上抽象.重载加重写.一切都不美好了 前几天调程序遇上个奇怪的bug.一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存 ...

  4. java批处理_Java内存模型你应该知道

    线程之间的通信和同步 线程之间的通信和同步是并发编程领域的关键问题. 线程之间的通信 通信是指线程之间以何种机制来交换信息.线程之间的通信一般有两种方式:共享内存和消息传递.在java中典型的消息传递 ...

  5. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  6. Java内存模型的抽象结构

    一. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题 ...

  7. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  8. java 面向对象的特性 抽象_java面向对象的四个特性

    java面向对象编程是指:Java语言提供类.接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements).另外 ...

  9. java 反射抽象_Java实现抽象工厂模式+java的反射的机制

    Java的反射机制: JAVA反射机制是就是运行的状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法 ...

最新文章

  1. appium-chromedriver@3.0.1 npm ERR! code ELIFECYCLE npm ERR! errno 1
  2. BZOJ3246 IOI2013Dreaming
  3. 鸿蒙是学生开发的系统,9岁小学生展示鸿蒙OS开发
  4. Mui --- app与服务器之间的交互原理、mui ajax使用
  5. 图像处理的交并比(IoU)
  6. Docker:Docker 性质及版本选择 [三]
  7. 第 89 章 Hardware
  8. matlab 平方根法解方程组,matlab改进平方根法
  9. 联想计算机usb启动怎么办,联想电脑没有u盘启动该如何解决?解决联想电脑没有u盘启动的方法...
  10. web工程无法访问本地图片解决方案
  11. python图书销售系统
  12. 数据清洗 Chapter07 | 简单的数据缺失处理方法
  13. 两段视频合成一个视频用什么软件 怎么把两段视频合成一段看不出来
  14. 树莓派获取LAN ip地址并发送到微信
  15. 产品经理必备文章50篇合集:从入门到提升
  16. win10 64位的d3dx9_43.dll
  17. 服务器上虚拟内存怎么设置方法,服务器的虚拟内存设置方法
  18. 支持DX12的DeepFaceLab(DeepFake)新版本除了CUDA也可以用A卡啦
  19. Linux下使用cfdisk工具格式化U盘/SD卡的方法
  20. 视频画质增强器--v1.0

热门文章

  1. 解决: Error Code: 2013. Lost connection to MySQL server during query
  2. 什么是面向对象编程(OOP)?
  3. 阿里巴巴开发规范--精选常用规范
  4. mysql修改配置文件进行优化
  5. golang 万年历的实现代码
  6. 看我骚操作‘破解’某查查app的sign以及某眼查的Authorization!
  7. 软件壳的概念和如何脱壳基础
  8. 个人对*xx与**xx的理解
  9. 含有未知中间变量同时需要传递其他中间变量的微分方程参数拟合
  10. 用for循环写520个我喜欢你