说到抽象,想必大家第一个联想到的就是抽象画,基本上看不懂画的是啥,只能说它在表达某个概念。
在java中我们中abstract关键字来表达抽象。举个例子:
我们说车子都可以跑(run)。但有几个轮子,怎么跑,对于不同的车有不同的结果。自行车需要人踩着跑,汽车发动机推动跑等等,那么我们可以车表达为抽象类。

/*** 车子类*/
public abstract class Car {public abstract void run();
}
/*** 自行车*/
class Bicycle extends Car{@Overridepublic void run() {System.out.println("人踩着跑。。。");}}
/**** 汽车*/
class Automobile extends Car{@Overridepublic void run() {System.out.println("发动机驱动跑。。。");}}

假如后面各种车,倒着跑、悬在空中跑随你怎么跑,只需要继承抽象类实现自己的业务就行了。相信大家对java抽象已有一个初步的印象了。

抽象方法:

1、从上面的例子中我们可以看到抽象方法跟普通方法是有区别的,它没有自己的主体(没有{}包起来的
业务逻辑),跟接口中的方法有点类似。所以我们没法直接调用抽象方法2、抽象方法不能用private修饰,因为抽象方法必须被子类实现(覆写),而private权限对于子类来
说是不能访问的,所以就会产生矛盾3、抽象方法也不能用static修饰,试想一下,如果用static修饰了,那么我们可以直接通过类名调
用,而抽象方法压根就没有主体,没有任何业务逻辑,这样就毫无意义了。

抽象类:

1、用abstract关键字来表达的类,其表达形式为:(public)abstract class 类名{}2、抽象类不能被实例化,也就是说我们没法直接new 一个抽象类。抽象类本身就代表了一个类型,无法
确定为一个具体的对象,所以不能实例化就合乎情理了,只能有它的继承类实例化。3、抽象类虽然不能被实例化,但有自己的构造方法(这个后面再讨论)4、抽象类与接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类
中可以有实例方法,并实现业务逻辑,比如我们可以在抽象类中创建和销毁一个线程池。5、抽象类不能使用final关键字修饰,因为final修饰的类是无法被继承,而对于抽象类来说就是
需要通过继承去实现抽象方法,这又会产生矛盾。(后面将写一篇关于finally的文章详细讨论)

抽象类与抽象方法的关联:

如果一个类中至少有一个抽象方法,那么这个类一定是抽象类,但反之则不然。也就是说一个抽象类中可
以没有抽象方法。这样做的目的是为了此类不能被实例化。如果一个类继承了一个抽象类,那么它必须全部覆写抽象类中的抽象方法,当然也可以不全部覆写,如果
不覆写全部抽象方法则这个子类也必须是抽象类(这样做就无意义了)
public abstract class Car {public void mothod1(){}public abstract void mothod2();public abstract void method3();}
class Bicycle extends Car{@Overridepublic void mothod2() {//需要覆写抽象方法mothod2}@Overridepublic void method3() {//需要覆写抽象方法mothod3}
}

抽象类的构造器:

先来看一个例子:

public abstract class Car {Car(){System.out.println("抽象方法无参构造函数");}Car(String a){System.out.println("抽象有参构造方法");}public void mothod1(){System.out.println(this.getClass());System.out.println("抽象类的实例方法");}public abstract void mothod2();}
/*** 自行车*/
class Bicycle extends Car{Bicycle(){System.out.println("子类无参构造函数");}@Overridepublic void mothod2() {//需要覆写抽象方法mothod2}
}
/**另一个包的测试类**/
public class Test {public static void main(String[] args) {Bicycle b = new Bicycle();b.mothod1();}
}
结果:
抽象方法无参构造函数
子类无参构造函数
class com.shaolin.service.impl.Bicycle
抽象类的实例方法

从上面的例子中可以看出:

1、抽象类是有构造方法的(当然如果我们不写,编译器会自动默认一个无参构造方法)。而且从结果来看,和普通的继承类一样,在new 一个子类对象时会优先调用父类(这里指的是抽象类Car)的构造器初始化,然后再调用子类的构造器。至此相信大家都会有这样一个疑问,为什么抽象方法不能实例化却有构造器呢? 对于这个问题网上也中说纷纭,没有确定答案。
我是这样想的:既然它也属于继承的范畴,那么当子类创建对象时必然要优先初始化父类的属性变量和实例方法,不然子类怎么继承和调用呢?而它本身不能实例化,因为它本身就是不确定的一个对象,如果它能被实例化,那么我们通过它的对象来调用它本身的抽象方法是不是有问题。所以不能实例化有在情理之中。因此大家只要记住这个规定就行。

2、对于抽象类中的非statci(静态)和非abstract(抽象)方法中的this关键字(静态方法中不能有关键字this之前已经讨论过可以参考 关于静态static那些事)代表的是它的继承类,而非抽象类本身,这个好理解,因为抽象类本身不能被实例化。如果有多个继承类,谁调用this就代表谁。

抽象类有什么好处呢?
1、由于抽象类不能被实例化,最大的好处就是通过方法的覆盖来实现多态的属性。也就是运行期绑定
2、抽象类将事物的共性的东西提取出来,由子类继承去实现,代码易扩展、易维护。
以上部分逻辑纯属个人观点,如有不正还望指出,谢谢!

java关键字abstract(抽象)详解相关推荐

  1. 【java基础】java关键字总结及详解

    Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量.Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能 ...

  2. Java关键字final使用详解

    2019独角兽企业重金招聘Python工程师标准>>> http://docs.oracle.com/javase/tutorial/java/IandI/final.html Wr ...

  3. 【Java编程】Java关键字final使用详解

    根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变 ...

  4. java中strictfp关键字,java strictfp关键字用法大全详解

    一.strictfp关键字简介 strictfp是Java中提供的一个保留关键字,该关键字是从这第java JDK2版本儿开始出现的一直沿用到现在,只不过很多情况下都不怎么使用,所以容易被大家遗忘,因 ...

  5. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  6. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  7. java提高篇之详解内部类

    转载自 java提高篇之详解内部类 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无 ...

  8. Java基础:volatile详解

    Java基础:volatile详解 1.volatile保证可见性 1.1.什么是JMM模型? 1.2.volatile保证可见性的代码验证 1.2.1.无可见性代码验证 1.2.1.volatile ...

  9. Java JUC并发编程详解

    Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...

最新文章

  1. 数字化专业人才短缺,企业亟待组建培养体系
  2. SM12表条目冻结说明
  3. xss权限维持(小技巧)
  4. mysql循环建表_MySQL 开发准则(总结自阿里巴巴开发手册)
  5. C#鼠标点击器-没有测试-转自http://hi.baidu.com/syq_ghost/item/2cc253eb538b72e7fb42ba44
  6. 吴恩达深度学习——循环神经网络
  7. psenet的eval_ctw1500.py解析
  8. [Swift通天遁地]一、超级工具-(11)使用EZLoadingActivity制作Loading加载等待动画
  9. python基础(16):学生信息管理系统——Python编写(附全部代码)
  10. 如何在Nintendo Switch上管理和传输数据
  11. java实现双向循环链表(循环双链表)
  12. 在网址前加神秘字母,让你打开新世界(z)
  13. 用数据告诉你,哪位导演是漫威影片中的票房收割机?
  14. ESP32产品系列之智能插座(一),框架及硬件设计
  15. vxe-table可编辑表格使用下拉框时下拉框层级问题
  16. 扑克迷如何在2019-03-28的市场中利用十字星进行跑赢大盘
  17. 微信企业号开发之 企业号人员身份认证与开发
  18. EasyCVR家庭远程视频监控解决方案
  19. Esri Leaflet示例索引及说明
  20. 成功失败算法matlab_如果将所有内容留给算法,为什么我们会失败

热门文章

  1. MySQL 中匹配正则表达式
  2. 哈工大操作系统实验——实现proc文件系统
  3. 在CISCO路由器上配置NAT功能
  4. 在线投票系统php源码,php简单 在线投票系统 源码下载,
  5. html立方体翻转,jQuery 3D立方体翻转插件
  6. poi导出excel时带有超链接
  7. shutdown和shutdownNow区别
  8. 几个免费的国外php空间
  9. AI医疗:一个垃圾桶背后的挑战
  10. mysql忘记密码处理方法