大家好,欢迎来到IT知识分享网。
前言
一些面经或者各地搜罗来的
unity面试题:https://blog.csdn.net/weixin_/article/details/
一、Unity
1. Unity3D协程和C#线程之间的区别?
协程:在主线程运行的同时开启另一端逻辑处理,当协助当前程序的执行。每帧结束后区检测yield的条件是否满足,任意指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。
多线程同时运行多个线程,除主线程之外的线程无法访问Unity3D的对象、组件、方法,缺点:协同程序并非真线程,协程也失去了标准线程使用多CPU的能力,可能会阻塞。
2. 游戏闪退
闪退的原因:
OS杀掉了我们的进程 – >OS杀掉我们游戏进程的原因 –>发生了不可修复的错误
native code 直接在CPU上跑的机器指令,发生了不可恢复的错误,比如,native code访问一个null指针
游戏开发,都是脚本语言,一般脚本语言解释执行,是不会导致进程闪退的,因为解释执行,虚拟机解释字节码,再严重的错误,都不会让OS杀掉进程,除非跑入了native code。比如,lua脚本,调用了底层某个API,而给的数据有错,导致底层的函数(native code)出现了不可恢复的错误。
总结:
- 代码逻辑错误;
- 调用引擎相关API的时候,给的数据不对:
- int a=b/c,此时会发生处理异常,可能导致闪退;
- bufer 1024,而我们穿了4048,导致内存越界,闪退了;
通过我们的崩溃日志,法线崩溃在引擎里面,还是崩溃在C库里面。
把相关代码注释掉,不闪退之后,再开启相关代码,定位到闪退位置。
3. 动态加载资源的方式
- Resources.Load()。官方不推荐,缺点:
- 缺点:
- Resources文件夹下的任何修改,都会导致Resources包重打;
- Resources让内存管理变得困难,因为它所有资源是初始化全部加载,并且常驻内存;
- Resources内的资源会增加应用程序的启动时间和构建时长;
- Resources资源无法增量更新;
- Resources的序列化:
- Resources目录下的文件会被合并为一个序列化文件,该文件有自己的meta信息和索引信息,内部采用红黑树实现资源查找,用于索引对应的file GUID和Load ID,并且记录序列化文件中的偏移量。
- 10000个asset的Resources目录,在低端设备上初始化需要5~10秒;
- 缺点:
- AssetBundle
- Addressable
- Yooasset
4. Unity的读写目录
- Resources,只读,不能动态修改;
- streamingAssetPath,只读,内容会原封不动放在包里
- persistentDataPath,唯一可读写的路径,不同的平台路径不同
5. 如何在安全的不同工程迁移asset数据?
- export Package;
- 将Asset目录和Library目录一起迁移;
- unity自带的Asset Server功能;(2017.1开始弃用)
6. Unity提供的几种光源
- 平行光:Directional Light
- 点光源:Point
- 区域光:Area
- 聚光灯:Spot
7. Unity生命周期
awake –> OnEnable –> start –> update –> fixedUpdate –> LateUpdate –> OnGUI –> OnDisable –> OnDestory
8. 自适应
- 通过UGUI的锚点和中心点自适应;
- 通过NGUI的Anchors自适应;
9. Unity中,照相机的Clipping Planes的作用是什么?调整Near、Fare两个值时,应该注意什么
Clipping Plane:裁剪平面
10. Unity和Android与IOS如何交互?
UnitySendMessage(物体名称,函数名,char*类型的数据);
11. 旋转
绕着世界坐标Y轴旋转:transform.Rotate(transform.up);
绕自身Y轴旋转: transform.Rotate(Vector3.up);
12. meta文件
作用:unity根据meta文件中的GUI来区分项目中的不同资源,meta文件是辅助unity管理资源文件的文件。
内容:
- GUID:unity分配的唯一id;
- MonoImporter:代码的meta会有这个,
13. 删除unity工程asset目录下的meta文件会发生什么?
删除meta文件,会让unity以为原始资源文件删除了,并给这个资源重新分配一个guid,导致引用丢失或者冲突;
14. 物体发生碰撞的函数
OnCollisionEnter
、OnCollisionStay
、 OnCollosionExit
15. unity施力的方式
rigidbody.AddForce/AddForceAtPosition
16. alpha blend工作原理
用于做半透明效果
17. 客户端和服务端的交互方式有几种?
socket,服务端与客户端的物理连接,主要有UDP和TCP两个协议,Socket处于网络协议的传输层;
http,主要有http协议,和基于http的soap协议,常见方式是htttp的post和get请求;
TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证;
18. TCP三次握手和四次分手
三次握手:
- 客户端发起:SYN=1,ACK=0;客户端进入SYN-SEND状态
- 服务端返回:SYN=1,ACK=1;确认号ack=x+1,初始序号seq=y;服务端进入SYN-SEND状态
- 客户端确认:ACK=1,确认号ack=y+1;客户端进入ESTABLISHED
现在,双方都是ESTABLISHED状态。
SYN:SYN=1表明这是一个“请求”或者”接收请求“的报文
ACK:ACK=1时,确认字号才有效。所以连接建立之后,所有往来的报文ACK=1
确认字号:期望收到对方下一个报文段的第一个数据字节的编号
四次分手:
- 客户端发起请求,断开连接。FIN=1,seq=u,(u是之前传送过来最后一个字节的序号+1)。客户端进入FIN-WAIT-1状态。
- 服务器返回确认信息。ACK=1,seq=v,ack=u+1。服务器进入CLOSE-WAIT状态。(此时客户端只能接收,如果服务器还有消息,可以传送)。
- 服务器没有可传的消息,给客户端发送请求结束的报文。FIN=1,ACK=1,ack=u+1,seq=w。服务器进入LAST-ACK状态
- 客户端收到FIN=1的报文后,返回确认报文:ACK=1,seq=u+1,ack=w+1。发送完毕后,客户端进入等待阶段,等待两个时间周期。关闭。
两个时间周期过后,所有报文消失。
19. UDP和TCP的区别
- 建立连接方式:TCP需要进行三次握手建立连接,而UDP则不需要建立连接,直接发送数据包。
- 可靠性:TCP提供可靠的数据传输机制,能够保证数据的完整性和顺序性;而UDP不提供可靠性保证,数据传输可能出现丢包或乱序的情况。
- 数据量:TCP对数据量的限制较小(最大传输单元为64KB),而UDP对数据量的限制较大(最大传输单元为65535字节)。
- 速度:UDP传输效率更高,因为它没有TCP的握手挥手过程。
- 流量控制:TCP有流量控制机制,可以根据网络情况调整传输速度,避免网络拥塞;UDP没有流量控制机制,可能会导致网络拥塞。
TCP适用于:要求可靠性、数据量小、带宽少的场景,如HTTP、SMTP等应用层协议;
UDP适用于:要求速度快、数据量较大、带宽充足的场景,如实时视频、音频等应用。
20. AssetBundle的压缩格式
BuildPipeline.BuildAssetBundle(UnityEngine.Object mainAsset, UnityEngine.Object[] assets, string pathName, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
其中BuildAssetBundleOptions就是压缩格式:
- UncompressedAssetBundle:不压缩,包体最大,加载最快
- ChunkBasedCompression:LZ4算法压缩,压缩包大,块压缩,但是时间短;
- None:LZMA算法压缩,流压缩,压缩包小,但是时间长;
https://blog.csdn.net/_/article/details/
LZMA:
流压缩方式,压缩率搞,包体更小;只支持顺序读取,所以加载时需要将整个包解压,会造成卡队和额外内存占用;
LZ4:
块压缩方式,数据被分为大小相同的块,被分别压缩,压缩率不及LZMA,但读取率比LZMA高很多;
使用loadfromfile或者loadfromstream,只会加载ab包的header,
ab卸载:
- 使用unload(true),卸载ab和ab加载的asset;a和b两个包存在依赖关系的时候,如果被引用的卸载了,引用的会资源丢失
- 使用unload(flase),卸载ab,ab和加载出来的asset关系会断掉;a和b依赖于c,a加载的时候,c也加载,如果通过false卸载了a和c,ab包消失了,但asset还存在,此时加载b时,c再次被加载,内存中就有两份了,即便是使用true卸载,第一次加载出来的c还是无法被卸载,导致内存泄露。
asset卸载:
- asset引用次数为0,ab引用次数为0,用unload(true)释放;
- asset引用次数为0,Resources.UnloadAsset,只能释放基础类型,如果a包里面有a1和a2,如果a1只用了一次,之后一直不用,a2一直备用,则a1一直在内存中,无法被释放;
21.补丁包用HashCode和MD5的区别
使用[HashCode]而不是[MD5]进行更新补丁包的校验是更优的选择。 HashCode是一种算法,通过某种算法得到的值,用于确定对象在hash表中的位置。它与对象的物理地址不同,代表的是对象在hash表中的位置。
- HashCode:长度为32位;
- MD5:长度为128位;
使用HashCode的优点包括:
- 高效性:HashCode计算速度较快,适合大规模数据的快速校验。
- 唯一性:虽然HashCode并不是完全唯一,但它能确保同一个类的对象按照特征有不同的哈希码,减少了碰撞的可能性。
- 灵活性:自定义的HashCode方法可以根据具体需求编写,适应不同的校验场景。
相比之下,MD5的优点在于其广泛的应用和较高的安全性,但缺点也明显:
- 安全性较低:MD5容易受到碰撞攻击,安全性较低,不适合用于安全要求高的场合。
- 计算量大:MD5的计算量较大,不适合大规模数据的快速校验。
因此,在需要高效且安全的校验方式时,使用HashCode比MD5更为合
二、动画
1. 游戏动画有几种?
关节动画、单一网格模型动画(关键帧动画)、骨骼动画
- 关节动画:将角色分成若干个独立部分,一个部分对应一个网格模型,部分动画连接成一个整体,角色比较灵活;
- 单一网格模型动画:在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果;
- 骨骼动画:广泛应用,继承了以上的两个优点,骨骼按照角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。
2. 链条关节
Hinge Joint,模拟两个物体通过一根铰链连接的情况
3.关键帧动画和程序动画
关键帧动画
在动画中特定姿态由关键帧定义,在Unity中可通过Animation设置多个关键帧,即可完成动画。
程序动画
C#与骨骼动画共同实现,通过代码控制计算骨骼的移动距离,角色行走在不平坦地面的时候,使用程序动画能够介入落脚位置,不会穿模,而关键帧动画则无法做到
4.Animation Curves
表示物体参数随时间变化的曲线。在Animation的面板中选择Curves即可切换到动画曲线界面,选中某个属性曲线在时间轴上Add Key添加节点,然后手动控制曲线的形状。
三、渲染相关
前言
shader blend:https://blog.csdn.net/lengyoumo/article/details/
ASTC格式:https://zhuanlan.zhihu.com/p/
透明图片灰边:https://blog.nowcoder.net/n/4119b0ec715a4f8d8e4395b3db382b8f
知识点
1. 渲染管线流程
- 应用阶段:由CPU负责实现,开发者对这个阶段有绝对控制权
- 遮挡剔除;
- 设置渲染顺序;
- 将渲染数据从硬盘加载到系统内存中,再把GPU需要的数据发送给显存;
- 设置渲染状态:告诉GPU用哪个顶点着色器、纹理、材质等;SetPassCall
- 发送DrawCall
- 几何阶段:
- 顶点着色器(完全可编程)
- 剪裁(摄像机Cliping)
- 屏幕映射
- 光栅化阶段:
2. OpenGL绘图
- 顶点渲染:对于每个顶点,输入顶点在世界坐标系中的位置,输出顶点在摄像头坐标系中的位置;
- 格栅化:对于每个三角形,输入三个顶点的信息,判断三角形覆盖了哪些像素;
- 像素渲染“对于每个像素,输入像素在屏幕上的位置,以及模型的其他信息和光照信息等,计算这个像素是什么颜色;
4. 将图片的Texture Type选项分别选为Texture和Sprite有什么区别?
spirit:作为UI精灵使用,需要图片的长和宽都为2的整数次幂,否则无法打包压缩资源;
怪不得,我们图集打包工具的图集size选项只有256\512\1024
texture:作为模型贴图使用;
4.1 Alpha Is Transparency
ShaderBnend:https://blog.csdn.net/lengyoumo/article/details/
透明图片灰边问题:https://blog.nowcoder.net/n/4119b0ec715a4f8d8e4395b3db382b8f
开启这个选项开启后,图片中所有完全透明像素(alpha == 0)的RGB会改写为:与其最临近非完全透明像素(alpha>0)的RGB。
透明图片灰边问题:
最终颜色=新颜色.RGB * 新颜色.A * (1-新颜色.A)
,当新颜色的Alpha为1时,背景色被盖住;新颜色的Alpha为0时,结果为背景色。
所以很多图像处理软件,输出Alpha=0的颜色时,就默认把RGB也设为0,即,只看RGB,所有透明的地方都是黑色。经过滤器的算法(双线性插值?)之后,边缘颜色=前景色和背景色(黑色)加权的结果,然而,如果背景为白色,则会出现明显的边界。
这时候,使用Alpha Is Transparency,灰边就奇迹的消失了!在unity中确实能看到边缘的消失,在图片预览中的颜色RGB会明显看到Alpha的变化。
4.2 MipMap
通过扩展空间换取画质,UI不需要MipMap,因为它一直在最前面,
打开MipMap开关,会在下方出现一个滑动条:
拖动滑动条,展示MipMap等级图片:
MipMap在闫令琪的计算机图形学课程Lecture09里有学习过,取样的图片类型越多,最后展示出来的图像质量就越好:
4.3 Read/Write Enabled
选中之后,将允许运行期间通过代码修改纹理颜色。但是,Unity会额外拷贝一份纹理放在内存中,也就是说一张纹理两个内存,所以一般我们不勾选。
4.4 平台压缩
贴图在导入之后,会自动设置压缩模式
Androud:不带透明通道的压缩成ETC1,带透明通道的压缩成ETC2,不被4整除的退回到RGBA32;
IOS:不带透明通道的压缩成RGB PVRTC,带透明通道的压缩成RGBA PVRTC,不是2的整数次幂的拖回到RGB32;
texture图片拖入的时候,unity会默认设置ToNerest,自动保证Android平台图片被4整除,IOS平台图片是2的整数次幂:
- RGB16格式:主要有两种
RGB565
和RGB555
- RGB565:每个像素用16位表示,占用两个字节,RGB分量分别用5、6、5位:
- RGB555:每个像素用16位表示,占用2字节,RGB分量分别用5、5、5(最高位不用)
- RGB24
- 每个像素24位,占3个字节;在内存中RGB各分量的排列顺序为:BGR、BGR、BGR…
- RGB32
- 每个像素32位,占用4个字节,R、G、B分别用8个bit表示,存储顺序为B、G、R,最后8个字节保留,在内存中RGB各分量的排列顺序为:BGRA、BGRA、BGRA…
- ETC1:有损压缩模式,主要用于Android平台
- 基本思想:将图片分为4*4的若干个像素块,每个像素块都按照一定规则编码成为一个64位(8字节)的数据。计算像素的平均颜色,然后记录这个平均颜色与每个像素的插值,平均颜色只耗费了一个像素的数据,插值并不完全真是,而是从一个固定的静态数据中找到最接近的插值(RGB一样),每个像素只需要记录其插值在静态数据中的索引即可。
- 压缩比:对于RGB24,每块的数据由
4*4*3字节=48
,压缩为8字节,压缩比为6:1 ;针对Alpha图,由4*4*1=16
,压缩为8字节- flipbit=0,是竖直分割,flipbit=1,是水平分割;
- differential模式,R5G5B5记录第一个子块平均颜色,R3G3B3记录第二个子块平均颜色;
- individual模式,R4G4B4记录两个子块的平均颜色;
- 适用于不需要透明度的场景,不支持Alpha通道,
- ETC2:
- 兼容ETC1;
- 需要设备支持OpenGL ES3.0
- 支持Alpha通道
- RGB PVRTC
- DXT1
- 针对不透明,或者,仅具一位Alpha的贴图,对于RGB565格式的贴图,DXT1具有4:1的压缩比,平均每个像素颜色占4位;
- 4*4个像素视为一个压缩单位,压缩后占用64位,其中2个16为的RGB颜色,和16个2位索引:
- color_0和color_1是4*4像素块中的两个极端值,通过插值计算出color_2和color_3作为中间颜色值,2位索引可以代表4个状态刚好可以完整表示color_0\color_1\color_2\color_3。
- 如果color_1小于color_0则便是,贴图完全捕头民,反正则表示有一位透明信息。
- ASTC纹理压缩:知乎 https://zhuanlan.zhihu.com/p/
- 使用建议:有Alpha的建议
ASTC5*5
,其他的建议ASTC6*6
; - 用它的原因:对贴图大小没有严格要求为2的幂次或者4的倍数、压缩之后占用的空间更小,对比其他格式,相同占用空间下质量更高;
- 压缩原理:
- 无论是
ASTC4*4
还是ASTC12*12
,每个ASTC block都是128bit,因此ASTC4*4
是8bpp(bits per pixel),ASTC12*12
则是0.89bpp。
- 无论是
ASTC4*4 ASTC5*5
的压缩质量都优于BC1,ASTC6*6
比前面两个差,但是比ETC2好,ETC2由于格式故有问题,很容易出现色块、色差;- 无Alpha通道的贴图建议压缩格式为ASTC 8×8。如果贴图为法线贴图,建议压缩格式为ASTC 5×5。有更高要求的贴图(比如面部、场景地面),可以设置压缩格式为ASTC 6×6,法线贴图为ASTC 4×4。
- 硬件限制:IOS-A8以上,安卓支持OpenGL 3.1
- 使用建议:有Alpha的建议
5. 一个Terrain,分别贴3张、4张、5张地表贴图,渲染速度有什么区别?
没有区别,不管几张图,只渲染一次;
6.Render Texture
Render Texture的格式,rt的格式和普通的tex2D的格式并不是一回事,rt的格式支持的有很多种,最基本的ARGB32是肯定支持的
四、优化
1. 如何优化内存
- 压缩自带类库;
- 对象池,使用预设
- 释放assetbundle占用的资源
- 降低模型的片面数,降低模型的骨骼数量,降低贴图大小
- 使用光照贴图;
2. 简述GC(垃圾回收)产生的原因,描述如何避免
- 减少new的次数
- 使用公用对象(静态成员)
3. 批量渲染(Batch)
答案来自:https://zhuanlan.zhihu.com/p/
批量渲染是通过减少CPU向GPU发送渲染命令(DrawCall)的次数,以及减少GPU切换渲染状态的次数,尽量让GPU一次多做一些事情,来提升逻辑线和渲染线的整体效率。但这是建立在GPU相对空闲,而CPU把更多的时间都耗费在渲染命令的提交上时,才有意义。
合批最重要的前提:材质必须相同!!!合批是节省了CPU的相关准备工作的工作量。
不管是一批还是多批,最终在此帧送到GPU的像素数量是相等的,数据是相同的。合批与否,对GPU的影响仅是像素到达的慢了还是快了,几乎不影响GPU的性能。
3.1. 动态合批(Dynamic batching)
本质:将数份Mesh的数据复制粘贴到一起,也就是实时的,每一帧都合并。 所以一句话总结动态合批:用复制数据的性能消耗换取提交Drawcall的性能消耗。
动态物体共用相同材质,Unity自动对这些物体进行批处理。动态合批是自动完成的,不需要额外操作;
3.2. 静态合批(Static batching)
本质:对标记为static的Mesh自动合并;以空间换时间提升渲染效率;
其优势在于:网格通常在预处理阶段(打包)时合并,运行时顶点、索引信息也不会发生变化,所以无需CPU消耗算力维护;若采用相同的材质,则以一次渲染命令,便可以同时渲染出多个本来相对独立的物体,减少了DrawCall的次数。在渲染前,可以先进行视锥体剔除,减少了顶点着色器对不可见顶点的处理次数,提高了GPU的效率。
其弊端在于:合批后的网格会常驻内存,在有些场景下可能并不适用。比如森林中的每一棵树的网格都相同,如果对它采用静态合批策略,合批后的网格基本等同于:单颗树网格 x 树的数量,这对内存的消耗可能就十分巨大了。
总而言之,静态合批在解决场景中材质基本相同、网格不同、且自始至终都保持静止的物体上时,很适用。
3.4 Mesh合并
https://cloud.tencent.com/developer/article/
详情看另一个文件
4. 如何降低DrawCall
DrawCall,CPU准备数据发送给GPU的次数,次数越多,消耗越大;
降低DrawCall的方法:静态合批,动态合批,注意同一个Panel使用同一种图集,lable在同一个层级上
5. Unity在移动设备上的优化资源方法
- 使用assetbundle,实现资源分离和共享,以及热更新;
- 定点数降低到8万以下;
- 剪裁粒子系统;
- animator出视野不更新
- 删除无意义的animator
6.图集合并
为什么需要动态图集?
无论是NGUI还是UGUI,在图集通常制作中,会分成common atlas和atlas两类,一个界面至少用到两张图集,会出现ABA图集穿插打断合批的情况。此外,在游戏内容多了以后,一张2048不够用,两张2048,就又出现啦ABA的情况,内存也上去了。因此出现了动态图集。
动态图集是什么?
在打包的时候,图片是零散的,但最后运行时,自动生成一张空白大图,然后将界面上用到的零散图片绘制在这个大图上,只将这个大图传入到GPU里头,达到合批的效果。由于手机界面制作过程中,标准分辨率往往低于2048,所以一张2048的动态图集就能完全解决一个界面的绘制了。所以一张2048就够用了。
7.动静分离
https://zhuanlan.zhihu.com/p/
https://cloud.tencent.com/developer/article/
通俗的讲,就是一个界面中,可活动的元素放在一个Canvas下,不活动的放在另一个Canvas下,虽然打断了合批,但减少了网格重构的时间;
动静分离的原因:在同一个Canvas下的某个元素发生变化时,同一个Canvas下的所有元素都会进行网格重建(ReBatch),将一直在动或者频繁移动的ui与静止不动或者不怎么动的ui分开,让合并的范围缩小,只合并那些会动的ui,不动的不参与mesh的操作;
网格重建:UGUI的网格重建分为两个部分:
- 重新计算画布内的各个元素的顶点,并进行合并;
- 讲整理好后的网格、贴图等数据拿去渲染;
动静分离是对于第一部分的优化,第二部分消耗是不变的;
五、C#
1.C#数据类型:
- 值类型
- 引用类型
- 指针类型
类型 | 描述 | 范围 | 默认值 | 字节 |
---|---|---|---|---|
bool | 布尔值 | True 或 False | False | 1 |
byte | 8 位无符号整数 | 0 到 255 | 0 | 1 |
char | 16 位 Unicode 字符 | U +0000 到 U +ffff | ‘\0’ | 2 |
decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M | 16 |
double | 64 位双精度浮点型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D | 8 |
float | 32 位单精度浮点型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F | 4 |
int | 32 位有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 | 4 |
long | 64 位有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L | 8 |
sbyte | 8 位有符号整数类型 | -128 到 127 | 0 | 1 |
2.float存储方式
float占用四个字节;
符号位:占用1位,0代表正数,1代表负数
指数位:占用8位二进制数,用于标识浮点数的指数部分
尾数位:占用23位二进制数,表示浮点数的尾数部分
3.多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为”一个接口,多个功能”。
静态多态:
- 函数重载
- 运算符重载
动态多态:
- abstract抽象类
- 接口
4. 数组定义
int[][] arr = new int[3][]; int[] arr = new int[3]; int[] arr = {1,2,3}; var a=new[]{ 1,2,3,};
2.float存储方式
float占用四个字节;
符号位:占用1位,0代表正数,1代表负数
指数位:占用8位二进制数,用于标识浮点数的指数部分
尾数位:占用23位二进制数,表示浮点数的尾数部分
3.多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为”一个接口,多个功能”。
静态多态:
- 函数重载
- 运算符重载
动态多态:
- abstract抽象类
- 接口
4. 数组定义
int[][] arr = new int[3][]; int[] arr = new int[3]; int[] arr = {1,2,3}; var a=new[]{ 1,2,3,};
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/147967.html