抽象类

抽象方法和抽象类

抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法

规则如下:

抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体,只能有方法签名。

抽象类不能被实例化。 无法使用new关键字来实例化类。

抽象类可以包含成员变量,方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类5种成分。抽象类的构造器不能用于创建实例,主要用于被其子类调用

含有抽象方法的类(包括直接定义和从父类继承)只能被定义成抽象类

抽象类概括起来有得有失:得指的是可以包含抽象方法,失的是不能用于创建instance

注意:

1、final和abstract永远不能同时使用

2、static和abstract不能同时修饰某个方法,但可以同时修饰某个内部类

3、private和abstract不能同时修饰方法

接口

从多个类中更彻底的提炼出一种更加特殊的“抽象类”——接口,接口定义了一种规范,接口定义了某一批类所需要遵守的规范。

接口体现的是分离和实现分离的设计哲学。

接口中允许定义默认方法(default修饰),私有方法和类方法,这些方法都可以提供方法实现。

Java9中接口的定义

[修饰符] interface 接口名 extends 父接口1,父接口2...
{零个到多个常量定义零个到多个抽象方法定义零个到多个内部类,接口,枚举定义零个到多个私有方法,默认方法或类方法定义
}

修饰符可以是public或者省略,省略则默认采用包权限访问控制符,即只有同包可以访问该接口 。

接口名与类名采用相同的命名规则

一个接口可以有多个父接口,但接口只能继承接口

由于接口是一种规范,所以接口里不能包含构造器和初始化块定义。

Java9为接口新增一种新的私有方法,私有方法不能使用default修饰,可以使用static修饰,也就是说私有方法可以是类方法也可以是实例方法

对于接口里定义的静态常量而言,系统会自动增加public static final修饰符。

对于普通方法,系统会自动增加public abstract来修饰。

接口的继承

接口支持多继承

使用接口

接口不能用于创建实例,但可以用于声明引用类型变量

接口主要有如下用途 :
定义变量,也可用于进行强制类型转换。

调用接口中定义的常量。

被其他类实现。

类实现接口语法格式如下:

[修饰符] class 类名 extends 父类 implements 接口1,接口2...
{类体部分
}

实现接口与继承父类相似,一样可以获得所实现接口里定义的常量,方法。

实现接口方法时,必须使用public访问控制修饰符,因为接口里的方法都是public的,而子类重写父类方法时访问权限只能更大或相等,所以实现类实现接口只能使用public访问权限

接口和抽象类

接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。

接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

二者的区别:

接口作为系统与外界交互的窗口,接口体现的是一种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务;对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。但一个程序使用接口时,接口是多个模块间的耦合标准。当在多个程序之间使用接口时,接口是多个程序之间的通信标准

抽象类作为系统中多个子类的父类,体现的是一种模板式设计。

在使用方法上也有区别:

1、接口里只能包含抽象方法,类方法,默认方法和私有方法 ,不能为普通方法提供方法实现,而抽象类则完全可以包含普通方法

2、接口里只能定义静态常量,不能定义普通成员变量;抽象类则都可以

3、接口里不包含构造器;抽象类里可以包含构造器。

4、接口里不包含初始化块,抽象类则可以

面向接口编程

1、简单工厂模式 详见书P198

2、命令模式 详见书P200

内部类

定义在其他类内部的类就被称为内部类。

内部类的作为:

1、内部类提供了更好的封装

2、内部类成员可以直接访问外部类的私有数据

3、匿名内部类适合用于创建那些仅需要一次使用的类

外部类的上一级程序单元是包所以它只有两个作用域:同一个包内和任何位置。因此只需要省略访问控制符和public。而内部类上一级程序单元是外部类,它就具有四个作用域:同一个类(private),同一个包(default),父子类(protected),任何位置(public)

非静态内部类

详细看《java疯狂讲义》P202

非静态内部类的成员只在非静态内部类范围内是可知的,并不能被外部类直接使用。如果外部类需要访问非静态内部类的成员,则必须显示创建非静态内部类对象来调用访问其实例成员。

非静态内部类对象和外部类对象的关系:

非静态内部类对象必须寄生在外部类对象里,而外部类对象则不一定有非静态内部类对象寄生其中。因此外部类对象访问非静态内部类成员时,可能非静态内部类对象根本不存在。

非静态内部类中不允许定义非静态成员

静态内部类

静态内部类的实例方法也不能访问外部类的实例属性:静态内部类是外部类的类相关的,而不是外部类的对象相关的。当静态内部类对象存在时,并不存在一个被它寄生的外部类对象,静态内部类对象只持有外部类的类引用,没有对象引用。

外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类成员

除此之外允许在接口中定义内部类,接口里定义的内部类默认使用public static修饰,也就是说接口里只能是静态内部类。

使用内部类

1、在外部类内部使用内部类

2、在外部类以外使用非静态内部类

OuterClass.InnerClass varName

在外部类以外的地方使用内部类时,内部类完整的类名应该是OuterClass.InnerClass。如果外部类有包名,则还应该增加包名前缀。

创建非静态内部类实例的语法:

OuterInstance.new InnerConstructor()
new OuterConstructor().new InnerConstructor()

3、外部类以外使用静态内部类

因为静态内部类是外部类类相关的,因此创建静态内部类对象时无须创建外部类对象

new OuterClass.InnerConstructor()

匿名内部类

匿名内部类适合创建那种只需要一次使用的类。

new 实现接口() | 父类构造器(实参列表){}

关于匿名内部类有如下两条规则:

1、匿名内部类不能时抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。

2、匿名内部类不能定义构造器,由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义初始化块,可以通过实例初始化块来完成构造器所要做的事。

如果局部变量被匿名内部类访问,在Java8以后,该局部变量自动使用了final修饰。

Java抽象类、接口和内部类相关推荐

  1. JAVA抽象类接口初始化块实验_抽象类和接口 - 逝水无痕7777的个人空间 - OSCHINA - 中文开源技术交流社区...

    抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法.有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法.抽象方法和抽象类必须使用abstract修饰符来定义. 抽象类不能被实例 ...

  2. java抽象类接口举例代码_Java接口和抽象类实例分析

    本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相 ...

  3. JAVA实验接口,内部类,抽象类的声明及使用

    1.按下图结构设计相关的接口和类: 要求:(1)正弦类Csin.余弦类Ccos.正切类Ctan的getValue()方法分别返回属性a的正弦值.余弦值.正切值,每个类设计2个构造方法. (2)设计一测 ...

  4. 包 权限修饰符 final 常量 枚举 抽象类 接口 多态 内部类 常用API 正则表达式 Lambda

    包 什么是包? 包是用来分门别类的管理各种不同类的,类似于文件夹.建包利于程序的管理和维护. 建包的语法格式:package 公司域名倒写.技术名称.报名建议全部英文小写,且具备意义. package ...

  5. Java抽象类+接口详细图解 一篇博客拿下

    目录 抽象类 抽象类的概念 抽象类的语法 抽象类的特性 抽象类的作用 接口 接口的概念 接口的语法 接口特性 实现多个接口 接口间的继承 接口实例 1.Compareable 2.Comparator ...

  6. Java抽象类/接口

    一.抽象类: 1.关键字:abstract ;修饰抽象类,抽象方法: 2.注释: 2.1.抽象类不可以创建对象,但是可以被声明引用(强制被使用多态): 2.2.抽象类不一定包含抽象方法,包含抽象方法一 ...

  7. Java中接口、抽象类与内部类学习

    2019独角兽企业重金招聘Python工程师标准>>> Java中接口.抽象类与内部类学习 接口与内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类和抽象方法 抽象方 ...

  8. java - 抽象类、接口、内部类

    2019独角兽企业重金招聘Python工程师标准>>> 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhan ...

  9. Java自学笔记——Java面向对象——04.抽象类、接口、内部类

    Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...

最新文章

  1. 远程连接docker中的mysql容器_docker构建mysql容器及Navicat 远程连接
  2. IntelliJ IDEA :Error:(1, 1) java: 非法字符: '\ufeff'
  3. docker-compose常用命令
  4. Learning Deep Structured Semantic Models for Web Search using Clickthrough Data (DSSM)
  5. 解决Oracle jdbc驱动包maven下载失败问题
  6. gwt前台开发_为GWT设置开发环境
  7. 成为Google认证机器学习工程师,零基础只需要2步?
  8. 土木工程和计算机专硕,第一次发帖 关于大工土木专硕
  9. PAT-BASIC-1003-我要通过!
  10. Android之汽车音频
  11. 通过密钥 SFTP(三)指定不限定根目录
  12. matplotlib plot 分组_Python数据分析模块二:Matplotlib
  13. Python的字符串格式化 %r %s
  14. Python3入门机器学习经典算法与应用 第3章 Numpy中的arg运算
  15. 三菱a系列motion软体_三菱PLC全系列编程电缆制作方法
  16. Matlab R2017的下载与安装详细教程以及软件的学习资源
  17. 医疗信息化建设售后服务方案
  18. java数据离散化模板
  19. 数学工具-desmos 图形曲线
  20. 华为手机误删照片,除了相册恢复,还有这招能救命

热门文章

  1. MySQL访问权限管理
  2. nginx ---- 静态资源部署
  3. php 小程序页面传参,介绍小程序中传递参数的实现方法
  4. python sys模块详解_python之sys模块详解
  5. left join,right join,inner join,full join之间的区别
  6. 10.15. TUI
  7. 电信网络拓扑图自动布局
  8. Oracle自增主键的添加[sequence]--表数据已存在
  9. 初学Phreeze 3
  10. How to remove replication in Syteline