抽象,内部类,接口,多态

2023-11-15

 final:最终的、不能改变的-----------------单独应用几率低

修饰变量:变量不能被改变

修饰方法:方法不能被重写

修饰类:类不能被继承

static final常量:应用率高

必须声明同时初始化

常常通过类名点来访问,不能被改变

建议:常量名所有字母都大写,多个单词用_分隔

编译器在编译时,会将常量直接替换为具体的数,效率高

何时用:数据永远不变,并且经常使用

抽象方法:

由abstract修饰

只有方法的定义,没有具体的实现(连{}都没有)

 抽象类:

由abstract修饰

包含抽象方法的类必须是抽象类

抽象类不能被实例化(new对象)

抽象类需要被继承,派生类:

重写超类的所有抽象方法----------变不完整为完整

也声明为抽象类----------------------不常用

抽象类的意义:

封装共有的属性和行为-------------------代码复用

为所有派生类提供统一的类型----------向上造型(代码复用)

可以包含抽象方法,为所有派生类提供统一的入口(向上造型后能点出来),同时可以达内强制必须重 写的目的(相当于制定了一个标准)

设计规则:

将派生类所共有的属性和行为,抽到超类中-------------抽共性

若派生类的行为/代码都一样,设计为普通方法

若派生类的行为/代码都不一样,设计为抽象方法

 抽象方法/抽象类的疑问:

抽象方法存在的意义是什么?

保证当发生向上造型,通过超类的引用能点出来那个方法----------保证能点出方法来

既然抽象方法的意义是保证能点出来,那为什么不设计为普通方法呢?

设计为普通方法,意味着派生类可以重写也可以不重写,但设计为抽象方法,则可以强制派生类必须 重写------------达到强制派生类重写,统一的目的

成员内部类:应用率低

类中套类,外面的称为外部类,里面的称为内部类

内部类通常只服务于外部类,对外不具备可见性

内部类对象通常在外部类中创建

内部类中可以直接访问外部类的成员(包括私有的),

内部类有个隐式的引用指向了创建它的外部类对象----------外部类名.this

匿名内部类:------------------------简化代码

若想创建一个类(派生类)的对象,并且对象只被创建一次,此时可以设计为匿名内部类

匿名内部类中不能修饰外面局部变量的值,因为该变量在此处默认为final的

常见面试题: 问:内部类有独立的.class吗?

答:有

隐式的引用:

this:指代当前对象

super:指代当前对象的超类对象

外部类名.this:指代当前对象的外部类对象

做功能的套路:

先写行为/方法:

若为某个派生类所特有的功能/行为,则将方法设计在特定的类中

若为所有派生类所共有的功能/行为,则将方法设计在超类中

窗口调用:

若为定时发生的,则在定时器中调用

若为事件触发的,则在侦听器中调用

 接口:

是一种数据类型(引用类型)

由interface定义

只能包含常量和抽象方法--------数据默认都是常量,方法默认都是抽象的

接口不能被实例化(new对象)

接口是需要被实现/继承的,实现类/派生类:必须重写所有抽象方法

一个类可以实现多个接口,用逗号分隔,若又继承又实现时,应先继承后实现

接口可以继承接口

关系:

类和类----------------------------继承extends

接口和接口----------------------继承extends

类和接口-------------------------实现implements

可以向上造型为:超类+所实现的接口

 设计规则:

将所有派生类所共有的属性和行为,抽到超类中----------------抽共性

若派生类的行为都一样,设计为普通方法

若派生类的行为不一样,设计为抽象方法

将部分派生类所共有的属性和行为,抽到接口中

接口是对继承的单根性的扩展-------------------------------实现多继承

接口相当于制定了一个标准、规范

-------实现了接口,那就能干某件事,若不实现接口,就干不了那个事

多态:多种形态

意义:

同一个对象被造型为不同的类型时,有不同的功能------所有对象都是多态的(明天才能体会)

------对象的多态:我、水、你......

同一类型的引用在指向不同对象时,有不同的实现-------所有抽象方法都是多态的

------行为的多态:cut()、getImage()、getScore()......

向上造型/自动类型转换:--------就是多态

超类型的引用指向派生类的对象

能点出来什么,看引用的类型

能造型成为的类型有:超类+所实现的接口

强制类型转换/向下转换,成功的条件只有如下两种:

引用所指向的对象,就是该类型

引用所指向的对象,实现了该接口或继承了该类

强转时若不符合如上条件,则发生ClassCastException类型转换异常

建议:在强转之前先通过instanceof来判断引用的对象是否是该类型

何时需要强转:若想访问的变量/方法在超类中没有,则需要强转

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

抽象,内部类,接口,多态 的相关文章

  • 在intellij中为java启用ssl调试

    从我的问题开始 上一期尝试通过 tls ssl 发送 java 邮件 https stackoverflow com questions 39259578 javamail gmail issue ready to start tls th
  • 如何判断我是在 64 位 JVM 还是 32 位 JVM 中运行(在程序内)?

    如何判断应用程序运行的 JVM 是 32 位还是 64 位 具体来说 我可以使用哪些函数或属性来在程序中检测到这一点 对于某些版本的 Java 您可以使用标志从命令行检查 JVM 的位数 d32 and d64 java help d32
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 可以混合使用 JVM 语言吗?即:Groovy 和 Clojure

    我知道你可以轻松地混合groovy java clojure java 无论什么JvmLang java 这是否也意味着我也可以让 clojure 和 groovy 代码进行交互 如果我使用 Grails 或 jRoR 我也可以在该环境中使
  • 当目标是属性时,@Throws 不起作用

    在看的同时这个问题 https stackoverflow com q 47737288 7366707 我注意到申请 Throws to a get or setuse site 没有影响 此外 唯一有效的目标 for Throws ar
  • JVM内存段分配

    好吧 我有一个关于 JVM 内存段的问题 我知道每个 JVM 都会选择稍微不同地实现这一点 但这是一个总体概念 在所有 JVM 中应该保持相同 一个在运行时不使用虚拟机执行的标准C C 程序在运行时有四个内存段 代码 堆栈 堆 数据 所有这
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • Bipush 在 JVM 中如何工作?

    我知道 iload 接受整数 1 到 5 但是如何使用 bipush 指令扩展到更高的数字 特定整数如何与字节码一起存储 有几种不同的指令可用于推送整数常量 最小的是iconst 指令 这些只是一个字节 因为该值是在操作码本身中编码的 ic
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 使用 libjvm.so 时出现 Sigsegv Java 致命错误

    我正在做重启测试Sles12sp2 using STAF v3 4 24一段时间后我收到此错误 A fatal error has been detected by the Java Runtime Environment SIGSEGV
  • 如何制作.Net或JVM语言?

    我看到了 NET 和 JVM 的所有这些新语言 一个人如何开始制作一个 我找不到关于 JVM 或 MSIL 规范的任何好的文档 Edit 我已经知道如何解析 我更感兴趣的是如何有这么多人基于这些平台创建新语言 你有点幸运 为 NET 开发的
  • Kotlin 支持 Java 11 吗?

    我尝试使用 Kotlin V1 2 70 Gradle V4 10 1 和 Java 11 使用 gradle 编译项目时 出现错误 未知 JVM 目标版本 11 支持的版本 1 6 1 8 Kotlin 编译器是否支持 Java 11 生
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 了解 Sun JVM [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 jni 从 C 调用 java 函数

    我正在编写一个简单的程序来从我的 C 程序调用 Java 函数 以下是我的代码 include
  • 将值存储为变量或再次调用方法更好吗?

    最近 我开始学习一些Java 从我对 JVM 的了解来看 JIT 使其在需要 CPU 周期的操作 即调用方法 上变得非常快 但也使其对内存产生了饥饿感 因此 当我需要与以前相同的方法获得相同的输出时 将之前的输出存储在变量中并再次使用它 同
  • 从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法

    我有一个桌面应用程序 当有人按下按钮时 我希望它启动另一个执行类的 main 方法的 JVM 我的桌面应用程序已经依赖于包含具有我想要执行的 main 方法的类的 jar 目前我有以下代码 但是 我希望它们是一种更优雅的方法 Runtime
  • 哪个更快:instanceof 或 isInstance?

    抛开设计问题不谈 什么在现代 JVM 上执行得更快 foo instanceof Bar or Bar class isInstance foo Why Class isInstance是 JVM 固有的 它被编译为与instanceof完
  • 这些用简单的java代码创建的JVM守护线程是什么?

    我有一个非常简单的java应用程序 它只是创建一个对象 调用它的一个函数 所有这些都在一个无限循环中 public class h public static void main String args while true B b new

随机推荐

  • error 1962

    今天电脑出了一点小毛病 报错 error 1962 No operation system found 由于很多的资料还有项目在里边存着 而且只有一个c盘 这可怎么解决 对于一个英文不好的中国人来说 这可是个麻烦事 静下心 仔细琢磨还是能够
  • C++11新特性

    1 列表初始化 2 变量类型推导 3 范围for循环 4 final与override 5 智能指针 6 新增加容器 静态数组array forward list以及unordered系列 7 默认成员函数控制 8 右值引用 9 lambd
  • gcc -lpthread

    转自 http www cnblogs com suntp p 6473751 html 如果用gcc编译使用了POSIX thread的程序时 通常需要加额外的选项 以便使用thread safe的库及头文件 一些老的书里说直接增加链接选
  • 《机器学习的随机矩阵方法》

    机器学习的随机矩阵方法 作者 Romain Couillet 和Zhenyu Liao 出版商 剑桥大学出版社 第 1 版 2022 年 10 月 31 日 语言 英语 精装版 408 页 ISBN 10 1009123238 ISBN 1
  • chrome浏览器https证书不安全页面打开设置

    访问https协议的页面浏览器都会加载此页面所需要的证书 在证书不被信任 即证书不是有正规CA机构颁发的话 通常是由自己通过证书生成工具或命令生成的 chrome浏览器会提示页面不安全而不会直接访问该页面 此时有两种选择 选择安全方式 不再
  • 面试题创作0005,请说明Linux 和 AI的关系(联系和区别)

    请说明Linux 和 AI的关系 联系和区别 可以在AI的业务应用 平台服务提供 平台设备商 集成电路开发等各个跟AI相关的行业来寻找联系和区别
  • MATLAB——矩阵与阵列

    变量及操作 变量命名规则 赋值语句 运算符和表达式 矩阵产生与表示 直接输入法创建矩阵 向量法创建矩阵 函数法创建矩阵 特殊矩阵 矩阵元素的引用 矩阵单个元素与行列提取 向量标识方式 矩阵基本操作 矩阵提取子块 合并短阵 转置与展开 提取子
  • Lion闭源大语言模型的对抗蒸馏框架实践

    Lion闭源大语言模型的对抗蒸馏框架实践 概述 对抗蒸馏框架概述 我们基于高级闭源LLM的基础上提炼一个学生LLM 该LLM具有三个角色 教师 裁判和生成器 有三个迭代阶段 模仿阶段 对于一组指令 将学生的响应与老师的响应对齐 区分阶段 识
  • ESP8266-NodeMCU(一)

    ESP8266 NodeMCU开发板的驱动有CH340和CP210等等 本文使用ESP8266 NodeMCU CH340驱动版本 一 开发板详解 NodeMCU是一个开源的IoT物联网硬件开发板 由于它支持WIFI功能且使用方法十分类似A
  • RAM处理器的8种寻址方式

    什么是寻址 寻址是指找到存储数据或指令的地址 然后读取其中的内容 寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式 是确定本条指令的数据地址以及下一条要执行的指令地址的方法 ARM处理器采用的RISC架构 CPU本身是不能直接
  • MyBatis resultMap collection标签 返回基本类型集合 如:List<Long> List<String> List<Integer>等

    class xxDTO private Long id private Set
  • vc 判断某个盘符是否为移动硬盘盘符

    在使用GetDriveType获取磁盘类型时 一般小容量的U盘直接返回DRIVE REMOVABLE 倒是不用再进行下一步的判断 而大容量U盘和移动硬盘的盘符返回值和本地硬盘盘符返回值都是DRIVE FIXED 需要再进行判断 如果是IDE
  • 【paddlepaddle】一键人物抠图

    效果 环境准备 win11 python3 8 pip install paddlepaddle i https pypi tuna tsinghua edu cn simple pip install paddlehub i https
  • animation 动画的定义和使用

    keyframes 定义动画 keyframes myname 0 50 100 调用动画 div animation name myfirst animation duration 5s animation timing function
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    Unity 开发人员的城堡游戏引擎概述 一 简介 2 Unity相当于什么GameObject 3 如何设计一个由多种资产 生物等组成的关卡 4 在哪里放置特定角色的代码 例如生物 物品 Unity 中 向 GameObject 添加 Mo
  • U盘启动盘制作(步骤详细)

    U盘启动盘制作 在制作启动盘之前我们需要先准备一个8G以上的U盘 和一台能上网的电脑 一 下载系统镜像 根据自己需要的系统版本去下载官方的镜像文件 记得要下载纯净的镜像 否则在后续安装好系统后会出现捆绑的现象 可以直接去下面这个网站下载 下
  • rsync实现文件服务器间文件同步

    rsync介绍 rsync命令工具可以实现服务器间的文件同步 全量或者增量 比如使用 size only来检查源端文件和目标端文件大小是否一致决定是否需要同步 由此同步的功能扩展 可以实现本机不同目录文件拷贝 快速删除海量文件等功能 但要注
  • MySQL隔离级别

    表结构和表数据如下 id 自增主键 uid 唯一索引 name price 普通索引 pictures 33 a Apple 12 NULL 34 b banana 5 NULL 35 c cherry 51 NULL 36 d date
  • Python语言 :关于使用装饰器的技巧介绍

    转自 微点阅读 https www weidianyuedu com 导语 装饰器 Decorator 是 Python 里的一种特殊工具 它为我们提供了一种在函数外部修改函数的灵活能力 它有点像一顶画着独一无二 符号的神奇帽子 只要将它戴
  • 抽象,内部类,接口,多态

    final 最终的 不能改变的 单独应用几率低 修饰变量 变量不能被改变 修饰方法 方法不能被重写 修饰类 类不能被继承 static final常量 应用率高 必须声明同时初始化 常常通过类名点来访问 不能被改变 建议 常量名所有字母都大