1.概述

抽象类、抽象方法以及接口,这三个知识点是每个程序员必备的基础,无论是在实际编程的时候,还是在面试的时候,都会出现这类问题,面试官很可能就会问你,interface和abstract的区别

当父类知道子类应该包含什么样的方法,但无法确定子类如何实现这些方法;在分析事物时,会发现事物的共性,将共性抽取出,实现的时候,就会有这样的情况:方法功能声明相同,但方法功能主体不同,这时,将方法声明抽取出,那么,此方法就是一个抽象方法。

2.抽象类小结

  1. 抽象类和抽象方法都必须用abstract修饰符来修饰,抽象方法不能有方法体
  2. 抽象类有构造器,但不能直接被实例化,要创建对象涉及向上转型,主要是用于被其子类调用
  3. 抽象类中可以没有抽象方法,但是有抽象方法的类必定是抽象类
  4. 抽象类中可以包含静态方法
  5. 抽象类不能用final修饰
  6. 抽象类不能用private修饰
  7. 抽象类也是类,一样是用来继承的,接口与类才是实现关系
  8. 外部抽象类不能用Static修饰,但内部的抽象类可以使用static声明
  9. 抽象类可以继承抽象类,抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体非抽象派生类必须覆盖它们
  10. 抽象类可以实现接口,可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

3.抽象类组成分析

普通类可以包含构造方法、普通方法、static方法、常量和变量等内容。而抽象类也是类,而且是一个特别的类,抽象类是指在普通类的结构里面选择性的增加抽象方法并以abstract关键字将该类修饰,是的,每个抽象类不管有没有抽象方法在其类结构中,abstract关键字非加不可。

1、抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。
2、抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。
3、抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。
4、抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
5、抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
6、abstract static不能同时修饰一个方法 (abstract方法没有方法体不能直接调用,static方法可以直接调用,冲突)

4.不能共存的关键字

不能与抽象类(abstract)共存的关键字主要有三个,分别是final、private、static

1、final
final:抽象类不能用final修饰。因为抽象类一定要被abstract修饰,而且抽象类一定要被继承否则该抽象类无意义。而被final修饰的类不能被继承,也就是说不能有子类,所以二者冲突不能同时使用!

2、private
private: 抽象类不能用private修饰,只能用public或protected。首先要明确一点:被abstract修饰的类是为了让非抽象子类看到并强制重写。如果抽象类中有私有的抽象方法,那么该抽象方法不被子类所知,就无法被复写。 而抽象方法出现的就是需要被复写。

3、static
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。众所周知,抽象方法是没有方法体的,可见运行也就没意义了。虽然外部抽象类不能用Static修饰,但内部的抽象类却可以使用static声明

//定义一个抽象类A
abstract class A{//定义一个内部抽象类Bstatic abstract class B{  //static定义的内部类属于外部类public abstract void saoMethod();}
}
class C extends A.B{public void saoMethod(){System.out.println("======saoMethod方法执行了======");}
}
public class StaticDemo {public static void main(String[] args) {A.B ab = new C();//向上转型ab.saoMethod();}
}

运行结果: saoMethod方法执行了

说白了抽象类的功能就是一个类定义模板的功能。

5.关于接口(interface)

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。

接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

6.抽象类与接口的区别

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的可以有非抽象方法,比如deaflut方法
4.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5.抽象类中可以包含静态方法,接口中不能包含静态方法
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7.一个类可以实现多个接口,但只能继承一个抽象类。

注意
有抽象方法不一定是抽象类,也可能是接口。抽象类不一定有抽象方法,可以有非抽象的普通方法。

JAVA知识基础(六):抽象相关推荐

  1. Java并发基础(六) - 线程池

    Java并发基础(六) - 线程池 1. 概述 这里讲一下Java并发编程的线程池的原理及其实现 2. 线程池的基本用法 2.1 线程池的处理流程图 该图来自<Java并发编程的艺术>: ...

  2. 【Scala教程】如何在已掌握的Java知识基础上快速上手Scala?【个人学习记录】

    如何在已掌握的Java知识基础上学习Scala 前言 正文开始! 1. 编译运行 2. 声明变量 3. 输出 4. 显式指定变量类型 5. 范围区间 6. 写入文本文件 7. 读取文本文件 8. if ...

  3. JAVA知识基础(一):数据类型

    在我们学习一门编程语言时,最先要了解的就是数据类型,而数据类型又都是抽象的概念,初学者理解起来比较困难,所以我们往往是先应用再理解,但是在本篇文章我决定用先理解再应用的方式尝试一下,试试效果. 1.对 ...

  4. JAVA知识基础(十):多态

    1.概述 1.1多态的定义 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 1.2多态的优点 消除类型之间的耦 ...

  5. JAVA知识基础(八):继承

    1.概述 1.1.继承的由来 至于由来简单一句话:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为. 继承描述的是事物之间的所属关系,这种关系是 is-a ...

  6. JAVA知识基础(十一):异常

    1.异常的概念 简单说就是不正常运行,最终导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象.Java处理异常的方式是中断处理. ...

  7. JAVA知识基础(九):this、super 关键字总结

    1.this关键字 this有三种常见用法 1.this调用本类中的属性,也就是类中的成员变量 2.this调用本类中的其他方法 3.this调用本类中的其他构造方法,调用时要放在构造方法的首行. 2 ...

  8. JAVA知识基础(七):封装

    1.概述 封装(Encapsulation)是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问. 要访问该类的代 ...

  9. JAVA知识基础(四):深入理解static关键字

    1.static存在的主要意义 static的主要意义是在于创建独立于具体对象的域变量或者方法.以致于即使没有创建对象,也能使用属性和调用方法! static关键字还有一个比较关键的作用就是 用来形成 ...

最新文章

  1. 逆向去除winrar广告
  2. WinForm 捕获最小化事件
  3. java 数组排序论文_Java 7是否对方法Arrays.Sort使用Tim Sort?
  4. 网站运行java_定制化Azure站点Java运行环境(5)
  5. 让AMD在中国发声 APU14技术创新大会首次在华召开
  6. oracle inventory directory,oraInventory目录的作用
  7. hihoCoder-1097-最小生成树一·Prim算法 (最小生成树)
  8. 本地计算机上的服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止 解决办法...
  9. c语言常用英语带音标,C语言常见英语单词,带音标
  10. 《犯罪心理学》读书笔记(part2)--犯罪心理学发展史
  11. 今天花了点时间详细了解了一下WiFi
  12. 小数除法竖式计算过程
  13. [ArcGIS] 空间分析(四) 三维分析
  14. aspose-words更新域/目录(页码不准确问题)
  15. 关于DateTime.Now.Ticks
  16. 固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型
  17. 中关村翠湖科技园:高端产业聚集区 (zz.IS2120@BG57IV3.T752270541 .K)
  18. 关于昨晚昨晚的银河护卫队2
  19. python进行词频统计_如何利用Python进行文本词频统计
  20. 【工具】java 时间比较工具

热门文章

  1. 求二叉树中结点个数代码java_求二叉树中第K层结点的个数
  2. web应用服务器计算资源核算,浅谈网络计算与应用.doc
  3. php置顶文章,php实现文章置顶功能的方法
  4. android+水滴粘性动画,Android控件实现水滴效果
  5. linux默认的https端口,如何在Ubuntu 18.04 Bionic Beaver Linux上拒绝除HTTP端口80和HTTPS端口443之外的所有传入端口...
  6. Linux内核权限维持,Linux权限维持笔记
  7. mysql新增后默认返回值_mybatis insert、update 、delete默认返回值解释与如何设置返回表主键...
  8. c++ char* 改变长度重新赋值_[C/C++] 2 :分析下列代码有什么问题?
  9. matlab中的terminator模块,2.2 Ground 及 Terminator模块
  10. jq ajax traditional,jQuery ajax - param() 方法