Java基础:编译时和运行时的区别

news2024/10/3 10:38:04

在java开发设计过程中,了解java运行时和编译时的区别非常有必要。

如下从几个问题来描述两者的区别


1、如下代码片段中,A行和B行的区别是什么

line A是在编译时计算值,line B是在运行时计算值。

当该类编译后,如果使用一些反编译器(如jd-gui)反编译后可以看到,实际代码如下:

java编译时会做一些优化操作,如替换一些final的不可变更的参数。

由于number1和number2都是final修饰,那么product1的值是确定的,这里就会在编译时计算出product1的值。


除如上的final修饰情况下代码优化

java中的泛型在编译时也会做优化,通过编译文件可以非常方便的看到其对应的实际类型,如下例子:

反编译后代码如下:

编译后的文件中,Parent类会显示的被实际类型取代。


2、重写,重载,泛型,分别是在运行时还是编译时执行的?

1. 方法的重载在编译时执行。

因为,在编译时,如果调用了一个重载的方法,那么编译时必须确定他调用的方法是哪个。

2. 方法的重写在运行时进行。

这个也常被称为运行时多态的体现。编译器没有办法知道它调用的到底是那个方法,相反的,只有在jvm执行过程中,才知晓到底是父子类中哪个方法被调用。

如:

3. 泛型(类型检测),发生在编译时。

编译器会在编译时对泛型类型进行检测,并把它重写成实际的对象类型(非泛型代码),这样就可以被JVM执行了。这个过程被称为"类型擦除"。

类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并在必要的时候添加类型检查和类型转换的方法。

类型擦除可简单理解为将泛型java代码转换为普通java代码。不过编译器更直接点,将泛型java代码直接转换成普通java字节码。

类型擦除的主要过程如下:

  1. 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
  2. 移除所有的类型参数。

4. 注解。注解有可能是运行时也有可能是编译时。

java中的@Override注解就是典型的编译时注解,它在编译时会检查一些简单的如拼写的错误(与父类方法不相同)等

同样的@Test注解是junit框架的注解,它是一个运行时注解,它可以在运行时动态的配置相关信息如timeout等。

5. 异常。异常有可能是运行时异常,也可能是编译时异常。

RuntimeException是一个用于指示编译器不需要检查的异常。RuntimeException是在jvm运行过程中抛出异常的父类。对于运行时异常是不需要再方法中显示的捕获或者处理的,如NullPointerException,ArrayIndexOutOfBoundsException 

已检查的异常是被编译器在编译时候已检查过的异常,这些异常需在try/catch块中处理的异常。

6. AOP. Aspects能在编译时、预编译时、运行时使用。

1). 编译时:当你拥有源码的时候,AOP编译器(AspectJ编译器)能够编译源码并生成编织后的class。这些编织进入的额外功能是在编译时放进去的。

2). 预编译时:织入过程有时候也叫二进制织入,它是用来织入到哪些已经存在的class文件或者jar中的。

3). 运行时:当被织入的对象已经被加载如jvm中后,可以动态的织入到这些类中一些信息。

7. 继承:继承是编译时执行,它是静态的。这个过程编译后就已确定

8. 代理(delegate):也称动态代理,在运行时执行


3、如何理解"组合优于继承"这句话

继承是一个多态的工具,而非重用工具。在没有多态关联关系的对象间,一些程序员倾向于用继承来保持重用。但事实是只有当子类和父类的关系为"is a"的关系时候,继承才会使用。

1. 不要使用继承来实现代码的重用。如果两者之间没有"is a"的关系,那么使用组合来实现重用。当父类的某个方法修改后,子类的相关实现也有可能会被更改。

2. 不要为了多态而使用继承。如果你只是为了实现多态而采用继承模式,那么实际上组合模式更加适合你,而且更加简洁和灵活。

这也就是为什么GoF设计模式中常说"组合优于继承"的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS导航

参考文章: (31条消息) ROS导航小车1 teb_local_planner参数(仅作记录/收集)_teb local planner参数_Crush Mome的博客-CSDN博客 运行导航: 1. 启动底盘控制包 : base_conctronl 2.启动键盘控制节点: rosrun teleop_twist_ke…

ROG魔霸7Plus电脑一直蓝屏错误怎么重装系统?

ROG魔霸7Plus电脑一直蓝屏错误怎么重装系统?有用户在使用ROG魔霸7Plus电脑的时候,频繁的遇到了系统蓝屏的情况。因为这样影响了自己的正常使用,所以想要进行系统的重新安装。那么如何进行系统重装操作呢?来看看以下的操作方法教学…

ONES × 中国信通院《中国企业软件研发管理白皮书》即将发布 | 预约直播

由 ONES 与中国信息通信研究院联合发起的《中国企业软件研发管理白皮书》(下称「白皮书」)将于 4 月 20 日 正式发布。白皮书由 ONES、中国信息通信研究院云计算与大数据研究所、招商基金管理有限公司、紫金财产保险股份有限公司、深圳市鸿合创新信息技术…

AI大模型内卷加剧,商汤凭什么卷进来

2023年,国内大模型何其多。 目前,已宣布推出或即将推出大模型的国内企业多达20余家,基本上能想到的相关企业都已入局。其中,既有资金雄厚的BAT、华为、字节等大厂,也有王慧文、王小川、周伯文等互联网大佬领衔的初创企…

外卖小程序01

目录 nginx反向代理和负载均衡反向代理好处nginx反向代理的配置方式 负载均衡**nginx 负载均衡的配置方式:****nginx 负载均衡策略:** 动静分离 用户密码加密需求代码实现 Swagger框架介绍使用步骤常用注解使用案例:员工登录EmployeeController实体类Emp…

科研成果 | 不同调制方式的开源数据集及其数据扩增方式

文章目录 1. 数据源2. 数据扩增2.1 基于opencv的一些基础变换2.2 基于GAN网络的方法2.2.1 SinGAN2.2.2 基于多图的GAN方法1. 数据源 网址: https://www.sigidwiki.com/wiki/VHF 每种数据基本只有一条,所以要用的话只能进行数据扩征 2. 数据扩增 两种方法: 基于opencv的一…

浏览器输入 http 自动转 https 问题解决方法

目录 表象 原因 解决方案 解决方案一 解决方案二 表象 今天在开发的过程中遇到一个问题,我们项目的地址是 “http://xxx.xxx.com/website/” ,结果粘贴到浏览器里自动跳转成了 “https://xxx.xxx.com/website/”。百思不解啊,为啥呢。 …

git上如何通过本地仓库推送自己的代码到远程仓储

从gitHub或者gitee上拉取代码后,我老是想着把别人的代码保存到自己的仓库上,这里教你一招。 gitee的: 首先我们在gitee或者github上创建一个自己的仓库,github的我就不在展示了,基本上和gitee操作一样 输入相关信息…

【redis】bitmap、hyperloglog、GEO案例

【redis】bitmap、hyperloglog、GEO案例 文章目录 【redis】bitmap、hyperloglog、GEO案例前言一、面试题二、统计的类型聚合统计排序统计问题:思路 二值统计 0和1基数统计 三、hyperloglog1、名词理解UV 独立访客PV 页面浏览量DAU 日活跃用户MAU 月活跃度 2、看需求…

愚蠢的往事-网络安全专题之数字证书

血泪教训史,我被骗去办理了数字证书。 文章目录 加密算法摘要算法数字签名数字证书血泪开篇数字证书 加密算法 相关知识点:对称加密算法、非对称加密算法、信息完整性验证算法。 对称加密算法:1.加密密钥和解密密钥相同的算法,…

小行助学答题系统编程等级考试scratch三级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级(2019年3月)在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.计算“248……128”,用变量n表示每项,根据变化规律&#xf…

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈

http客户端Feign &#xff08;一&#xff09;基于Feign远程调用 1、RestTemplate方式调用存在的问题 2、Feign的介绍 3、定义和使用Feign客户端 这个接口里面将来的封装的就是所有对userservice发起的远程调用 1、orderserivce的pom <!--feign客户端依赖--> <depe…

Dsq: 用于针对JSON、CSV、Excel、Parquet等运行SQL查询的命令行工具

目录 About Install macOS Homebrew macOS、Linux和WSL上的二进制文件 Windows上的二进制文件&#xff08;非WSL&#xff09; 从源代码生成和安装 Usage Pretty print dsq的管道数据 多个文件和连接 无需查询即可将数据转换为JSON 嵌套在对象中的对象数组 嵌套对象…

ASRock Z690 Extreme WiFi 6E i7 13700KF电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板ASRock Z690 Extreme WiFi 6E 处理器Intel Core i7 13700KF已驱动 内存KINGBANK 2x32GB DDR4-3600CL18已驱动 硬盘Predator SSD GM7000 1TB已驱动…

qt5.15.2配置android

qt安装安卓编译器就直接跳过&#xff0c;我们开始将如何进行配置。 如果专门开发的app&#xff0c;则应该使用android进行开发&#xff0c;qt是熟悉qt语言&#xff0c;或者app需要进行跨平台的话则使用qt for android比较好。 下载 首先安装jdk&#xff0c;最好安装 jdk11&am…

[Java] Socket (UDP , TCP)

目录 什么是Socket ? TCP api 与 UDP api 的特点 : UDP api 使用UDP Socket 实现一个单词翻译 : TCP api 使用TCP协议来实现一个回显服务 什么是Socket ? 应用层和传输层之间的桥梁 . 程序猿写网络代码 (应用层) , 要想发送这个数据 , 就需要去调用下层协议 , 应用层…

uniapp图片转base64及JS各文件类型相互转换

uniapp图片转base64及JS各文件类型相互转换 1、chooseImage request arrayBufferToBase642、chooseImage getFileSystemManager3、chooseImage FileReader4、扩展-JS各文件类型相互转换4.1 File 转成 ArrayBuffer4.2 File 转成 blob4.3 File 转成 base644.4 ArrayBuffer 转…

【数据结构】前序遍历,中序遍历,后序遍历(二叉树)

一&#xff1a;给图求前序&#xff0c;中序&#xff0c;后序 前序遍历&#xff08;先序遍历&#xff09; 核心思想&#xff1a;根左右 前序序列&#xff1a;ABDEFCGH 先访问根结点A&#xff0c;打印A&#xff0c;然后访问左子树&#xff0c;此时左子树B又作为根节点&#xf…

JAVAWeb05-xml、DOM4J

1. xml概述 1.1 官方文档 地址: https://www.w3school.com.cn/xml/index.asp 1.2 为什么需要 XML 需求 1 : 两个程序间进行数据通信&#xff1f;需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有…

【数字人】使用Metahuman创建数字人模型(上)

这两年数字人类的概念可谓是风头正盛&#xff0c;市面上也流行起各式各样的数字人技术&#xff0c;效果能力及实现成本各不相同。本系列介绍基于Unreal Engine的Metahuman工具低成本构建一个拥有完整的控制权、免费、可商用、高仿真的数字人。本篇为构建基础人物模型 MetaHuma…