Java基础(四)——多态、抽象类、接口、内部类

2023-10-29

一、 多态

1.     多态性是指同一操作作用于某一类对象,可以有不同的解释,产生不同的执行效果。(同一事件发生在不同的对象身上,有不同的效果)。

 

2.     多态存在的三个必要条件

a)      需要存在继承和实现关系;

b)      同样的方法调用而执行不同操作、运行不同代码;(重写操作)

c)       在运行时父类或接口的引用变量可以引用其子类的对象;

3.     多态的作用(主要是父类对象的引用变量可以引用其子类的对象,越是抽象的东西  越代表稳定)

多态通过分离做什么和怎么做,从另一个角度将接口和实现进行分离;

多态消除了类型之间的耦合关系;

多态的存在提高了程序的扩展性和后期的可维护性。

4.     对象的上下转型

向上转型:

a)      由子类转型成父类,在继承图上是向上移动的;

b)      从一个较专用类型向比较通用类型转换,所以总是安全的,即子类是父类的一个超级;

c)       在向上转型过程中,类接口唯一可能发生的事情是丢失方法,而不是获取方法(父类的引用变量只能调用父类中的方法或子类重写父类的方法);

向下转型:

a)      与向上转型的操作相反,不安全(可能需要instanceof操作符协助);

Note:instanceof运算符用来在运行时通过返回一个布尔值来指出对象是否是特定类或者是它的子类的一个实例。

       result = object  instanceof class

      判断对象object是不是class或其子类的一个实例

b)      LSP(liskov替换原则);子类型必须能够替换掉它们的基类型;

5.     动态绑定和静态绑定

(静态绑定)在程序执行前方法已经被绑定,即该方法不能再被改写,java当中的方法是final,static,private和构造方法都是前期绑定的。

(动态绑定)运行时,根据变量实际引用的对象类型决定调用哪个方法。

二、 抽象类

1.       Java中可以定义没有方法体的方法,即抽象方法,该方法由子类来具体的实现,含有抽象方法的类成为抽象类。

2.       抽象方法的特点:——只有方法的声明,没有方法的实现

a)      只有方法头没有方法体的方法成为抽象方法(即只做个方法的声明);

b)      抽象方法用abstract来修饰;

c)       抽象方法代表一种不确定的操作或行为。

       抽象类特点:

a)      定义中含抽象方法的类叫做抽象类;

b)      抽象类用abstract来修饰;

c)       抽象类代表一种抽象的数据类型;

d)      抽象类不能实例化;

e)      抽象类中可以有具体方法,可以没有抽象方法;

f)       一旦一个类继承了抽象类,那么这个类幺妹实现抽象类中的抽象方法,要么继续抽象下去。

g)      抽象类,声明即可,由子类去具体实现,不用{}

public abstract void teaching();

3.       使用抽象类定义的模板方法

定义:一个模板方法用一些抽象的操作定义一个算法,而子类将重新定义这些操作已提供具体行为。

意图:定义一个操作中的算法框架,把一些步骤推迟到子类去实现。模板方法模式让子类不需要改变算法结构而重新定义特定的算法步骤。

三、 接口

1.     接口语法

interface  接口名{ //静态常量、抽象方法 }

2.     接口特点

a)      接口中只能存放静态常量和抽象方法;

b)      Java接口是对功能的扩展(非通用方法,存放特有的方法或变量);

c)       通过实现接口,java类可以实现多实现;

d)      一个类可以同时继承(extends)一个父类并且实现(implements)多个接口;

e)      接口与接口之间可以通过使用extends来产生继承关系;

f)       抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象;

g)      接口的引用变量可以引用其实现类的对象(类似于父类的引用变量可以引用其子类的对象)。

3.     面向接口的编程

开放系统时,主题构架使用接口,接口构成系统的骨架;

4.     简单工厂模式

a)      定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。

b)      意图:定义一个类,由它负责根据一定的条件创建某一具体类的实例。

5.     策略模式

定义:是对算法的包装,把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类型的子类型。

四、 内部类

1.     内部类:将一个类定义在另一个类的内部

a)      内部类可以很好的实现隐藏,可以使用public、protected、private修饰符;

b)      内部类可以直接访问外部类的所有成员,包括私有成员;

c)       外部类不能直接访问内部类的成员,必须要建立内部类的对象才可以访问;

d)      内部类可以间接地实现多继承,还可以避免修改接口而实现同一个类中两种同名方法的调用。

2.     成员内部类特点

a)      成员内部类属于外部类的实例成员,成员内部类可以有public、protected、default、private 权限修饰符,在成员内部类中访问外部类的成员方法和属性,使用外部类名.this.成员方法(属性)形式;

b)      创建成员内部类的实例使用“外部类名.内部类名  实例名 = 外部类实例名.new 内部类构造方法(参数)”;

c)       成员内部类名不能与外部类名重名;

d)      不能在成员内部类中定义static属性、方法和类(static final形式的常量定义除外)。因为一个成员内部类实例必然与一个外部类实例关联,static成员完全可以移到其外部类中去。

3.     匿名内部类及应用

a)      匿名内部类是没有名称的内部类,没有办法引用它们。必须在创建时,作为new语句的一部分来声明并创建它们的实例;

b)      匿名内部类必须继承一个类(抽象,非抽象都可以)或者实现一个接口。如果父类(或父接口)是抽象类,则匿名内部类必须实现其所有抽象的方法;

c)       匿名内部类中可以定义代码块,用于实例的初始化,但是不能定义静态代码块;

d)      语法:new  interface、superclass(){  //类体}  这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例。

4.     静态内部类及应用

a)      使用static修饰的成员内部类叫静态内部类;

b)      静态内部类和外部类没有任何关系,只是在生成类名和类定义时有影响。静态内部类可以看做是与外部类平级的类;

c)       静态内部类的使用方式与外部类平级的类完全相同;

d)      静态内部类不能与外部类重名;

e)      静态内部类不能访问外部类的非静态的属性和方法,外部类不能访问内部类的非静态的属性和方法;

f)       创建静态内部类的实例使用外部类名.内部类名 实例名 = new 外部类名.内部类名(参数)。

5.     局部内部类

a)      定义在代码块、方法体内的类叫局部内部类;

b)      局部内部类访问外部类的属性和方法:外部类名.this.属性名/方法名(参数);

c)       对外部世界完全隐藏,只能在其作用域内生成对象;

d)      局部内部类不能加访问修饰符,因为它们不是类成员;

e)      成员内部类不能与外部类重名;

f)       局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础(四)——多态、抽象类、接口、内部类 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • HTML页面

    HTML 1 资源分类 1 1 静态资源 使用静态网页开发技术发布的资源 特点 所有用户访问 得到的结果是一样的 如 文本 图片 音频 视频 HTML CSS JavaScript 如果用户请求的是静态资源 那么服务器会直接将静态资源发送给
  • [每日两题系列]刷算法题咯~~

    今日题目 判定是否互为字符重排 最后一块石头的重量 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的
  • #define用法总结

    刚开始接触VC 的同学们 估计对这个东西有这莫大的恐惧 这个经常写在添加头文件的地方的奇怪语句 如果看过mfc那么 那么拿出一些application framework里面的宏 估计会吓死一片 说了这么多只是想说 不明白其用法的人很害怕
  • 经典法谱估计(1)周期图法MATLAB及Python实现

    原理 对于一个无限长序列x n 其傅里叶变换DTFT 也可称作离散时间傅里叶变换 及其反变换的定义式为 但是在我们的分析处理过程中 只能分析处理离散化的信号 也即N点取样 对于一个长度为N的有限长序列x n 其离散傅里叶变换及其反变换的定义
  • osgEarth的Rex引擎原理分析(一二一)osgEarth::TileRasterizer功能详解

    目标 五十二 中的问题123 本质是一个相机 用于将下面的节点渲染到纹理中 src osgEarth TileRasterizer class OSGEARTH EXPORT TileRasterizer public osg Camera
  • 神经网络面试题-1

    文章目录 1 批规范化 Batch Normalization 的好处都有啥 2 如果我们用了一个过大的学习速率会发生什么 3 下图所示的网络用于训练识别字符H和T 如下所示 4 增加卷积核的大小对于改进卷积神经网络的效果是必要的吗 5 假
  • maven跳过单元测试-maven.test.skip和skipTests的区别

    原文链接 http blog csdn net arkblue article details 50974957 DskipTests 不执行测试用例 但编译测试用例类生成相应的class文件至target test classes下 Dm
  • 【Linux C小技巧】零长度数组的使用

    本期主题 讲清Linux C的零长度数组使用 内容包括 零长度数组是什么原理 为什么要使用零长度数组 与指针的差异 往期链接 数据结构系列 先进先出队列queue 数据结构系列 栈 stack Linux内核链表 目录 0 前言 1 零长度
  • git上传代码到github

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1219 一 首先在windows上安装msysgit 1 msysgit下载地址如下 链接 https pan baidu com s 1T
  • 小米红米手机刷入Recovery手机教程-TWRP下载-获取root权限-新增小米12/13Pro适配

    刷机注意 本教程为小米全机型 目前已整理机型都可以使用 请确保你的电脑能正确连接你的手机 部分手机需要解锁BL 小米解锁BL教程 http www romleyuan com lec read id 83 更新日志 20230221更新日志
  • 【atoi函数的介绍以及模拟实现】

    目录 前言 一 atoi函数测试 1 要求 2 测试 二 atoi函数模拟实现 三 补充 前言 位置 atoi函数包含在
  • 天地图服务与开发

    天地图服务与开发 天地图在线地图网址 2021年7月2日 国家地理信息公共服务平台天地图2021版正式启用 传统版地址 https map tianditu gov cn 2020 新版地址 https map tianditu gov c
  • ssh telnet linux中显示中文

    vi etc sysconfig i18n 将内容改为 LANG zh CN GB18030 LANGUAGE zh CN GB18030 zh CN GB2312 zh CN SUPPORTED zh CN GB18030 zh CN z
  • office中excel设置下拉框多选

    我参照了这篇文章 https www php cn topic excel 444717 html 这篇文章整体写得不错 但是有些小瑕疵 问题1 在模块1中保存 这里并没有说清楚 具体是 VBA编辑器中 插入 模块 然后复制以下代码 Pub
  • js if else return不管用_前端知识013 学会异步,JS不再烧脑

    01 同步和异步 0101 认识同步异步 0102 前端经常遇到的异步操作 三个经典例子 0103 拿到异步的结果 轮询和回调 0104 回调的几种方式 02 Promise 0201 Promise基本用法 0202 Promise 基本
  • 【打卡-蓝桥杯】Day 7

    题目1 基础练习 芯片测试 解题思路 因为好的芯片多于坏的 所以如果是好芯片 那个被测试为 1 的 总数 gt n 2 代码 n int input arr list map int input split for in range n f
  • python自动化控制设备有限公司_华为 Python网络自动化

    哈喽 大家好 我是艺博东 是一个思科出身 专注于华为的网工 好了 话不多说 我们直接进入正题 光棍二十年 不知道情人节是什么鬼东西 还是好好学技术吧 努力 奋斗吧 为了早日走向人生巅峰 迎娶白富美 拼了 1 安装环境并导入相关模块 首先是安
  • 错误 0xc0202009: 数据流任务 1: SSIS 错误代码 DTS_E_OLEDBERROR。出现 OLE DB 错误。

    原来是一个varchar字段出出现了 和 等特殊字符 这个在insert语句中没有问题 但是使用导入导出会报错 最后要注意的是 导入导出使用的是BulkInsert 方式 每次可能读取一大段 多行记录一起处理 如果这批数据中有错 那么 程序
  • html5注册阿里巴巴作业,面试分享:2018阿里巴巴前端面试总结(题目+答案)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 使用js实现一个持续的动画效果 最开始的思路是用定时器实现 最后没有想的太完整 面试官给出的答案是用 requestAnimationFrame var e document getElemen
  • Java基础(四)——多态、抽象类、接口、内部类

    一 多态 1 多态性是指同一操作作用于某一类对象 可以有不同的解释 产生不同的执行效果 同一事件发生在不同的对象身上 有不同的效果 2 多态存在的三个必要条件 a 需要存在继承和实现关系 b 同样的方法调用而执行不同操作 运行不同代码 重写