JAVA之编译期和运行期区别

编译期:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。
运行期:java虚拟机分配内存,解释执行字节码文件。

从以下代码开始说明,欢迎大家指正

img

可以思考下,第一行跟第二行在编译时期有什么区别?

java编译时会做一些优化操作。第一行,因为是两个常量做运算,那么他们的结果就是确定的,即num1的值是确定的。所以在编译时,编译器就会直接算出num1的值。第二行则不会,java在运行时期才为变量分配内存空间。

所以Eclipse编译得到.class文件,打开class反编译后可以得到如下代码:

img

PS:使用Android Studio 编译器结果有点不一样,但不影响说明。

img

1、方法重载是在编译时执行的。因为在编译的时候,如果调用了一个重载的方法,那么编译时必须确定他调用的方法是哪个。如:当调用evaluate(“hello”)时候,我们在编译时就可以确定他调用的method #1.

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

img

试想,当有如下一个接口的时候,我们是无法确定到底是调用父类还是子类的方法

3、泛型(类型检测),这个发生在编译时。
这也正是泛型的好处之一,可以提前暴露问题,而不是等到运行时出现ClassCastException。编译器会在编译时对泛型类型进行检测,并把它重写成实际的对象类型(非泛型代码),这样就可以被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):也称动态代理,是在运行时执行。

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

  1. 不要使用继承来实现代码的重用。如果两者之间没有"is a"的关系,那么使用组合来实现重用。当父类的某个方法修改后,子类的相关实现也有可能会被更改。
  2. 不要为了多态而使用继承。如果你只是为了实现多态而采用继承模式,那么实际上组合模式更加适合你,而且更加简洁和灵活。
    这也就是为什么GoF设计模式中常说"组合优于继承"的原因。

你能区分编译时继承和运行时继承的区别吗?请列举例子说明
实际上在java中只支持编译时继承。java语言原生是不支持运行时时继承的。一般情况下所谓编译时继承如下:
如上有两个类,其中Child为Parent的子类。当我们创建一个Parent实例的时候(无论实际对象为Parent还是Child),编译器在编译期间会将其替换成实际类型。所以继承实际上在编译时就已经确定了。

而在java中,可以设计通过组合模式来尝试模拟下所谓的运行时继承。

img

在Child类中,其中有一个Parent实例。通过这种方式,我们动态的child类中代理了parent的相关功能。

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

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

相关文章

Java 设计模式——组合模式

概述 有时我们可能会被要求处理一个层级结构明显的对象,比如上下级的公司员工、比如层级嵌套的文件夹,还有丰富多彩的美食菜单。可是,我们可能要屡试不爽地编写深度搜索代码、要小心翼翼地编写递归逻辑。现在你可以忘掉这些,学习…

关于海康官网接口文档中:取流URL有效时间为5分钟表述歧义的说明

在海康官方在线接口文档中(原文链接:https://open.hikvision.com/docs/63f761576c594a309708525e1eefdbdb),关于视频预览接口中:获取监控点预览取流URLv2 ,这个接口的接口说明第6条为保证数据的安全性&…

调用海康视频接口获取预览取流的URL

开始之前请参考海康官方SDK文档 鉴于前段时间刚接触视频这一块,整理了自己的一些经验,具体的你们还是参考文档来吧 附上文档地址 https://open.hikvision.com/docs/docId?productId5c67f1e2f05948198c909700&curNodeId16741aecc05944a6b0cd1341d68…

c if语句多个条件判断顺序_Java中的流程控制语句 (基础篇四)

流程控制就是对事物次序的布置和安排,在程序中就是对代码执行次序的安排和控制程序中的流程控制主要有三种:顺序流程、选择流程、循环流程。顺序流程:比如打印输出的代码按照指定的顺序结构依次排序,打印的结果按照代码的顺序执行打印&#x…

git checkout 会把改动带过去吗_原创 | 操作失误不要慌,这个命令给你的Git一次反悔的机会...

点击上方蓝字,关注并星标,和我一起学技术。今天我们来介绍git当中两个非常非常好用的工具,git show和reflog。这两个命令虽然不是必知必会,但是如果熟练使用可以极大地帮助我们查看代码仓库的问题,以及在我们操作失误的…

计算机指令执行与时序逻辑,时序逻辑系统

时序逻辑电路其任一时刻的输出不仅取决于该时刻的输入,而且还与过去各时刻的输入有关。常见的时序逻辑电路有触发器、计数器、寄存器等。时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态&#xff0…

flume连接kafka_日志收集系统架构设计:(flume+zookeeper+kafka+php+mysql )

正文内容一、安装jdk二、安装flume三、安装kafka1、zookeeper2、kafka四、启动测试步骤五、目录说明六、日志收集系统设计图七、大数据参考资料推荐一、安装jdk -(版本:1.8.0_191)1.下载:https://www.oracle.com/technetwork/java/javase/downloads/jdk8…

2020班徽设计图案高中计算机,高铁工程学院举办2020级班徽设计大赛

大赛现场12月3日,高铁工程学院团总支第四届“班徽设计”大赛在GB250教室隆重举行,高铁工程学院20级新生各班参赛,20级辅导员代表出席评委席并参与评分。获奖选手领取证书本次比赛采用了线下评分及线上投票相结合的方式。比赛开始,…

Web浏览器没有Flash如何播放RTMP协议直播

各大主流浏览器在很早的时候就已声明 2020 年底不支持 Adobe Flash。所以已经线上运行的项目以及涉及直播的项目,都会涉及一个问题 : “没有 Adobe Flash 在 Web 浏览器端如何播放 RTMP 直播流?” 还好有先见之明,我参与涉及直播的…

video-js RTMP直播

目前主流的几种直播协议 协议传输方式视频封装格式延时数据分段html播放httpflvhttpflv低连续可通过html5解封包播放(flv.js)rtmptcpflv tag低连续不支持dashhttpts文件高切片可通过html5解封包播放(hls.js)hls$1mp4 3gp webm高切片如果dash文件列表是mp4webm文件,…

EJB到底是什么?(通俗易懂白话文)

1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么,总得说说什么是所谓的"服务 集群"和"企业级开发&…

ABC334 A-F

打的很懒的一场B卡了D看不懂题卡了F没看完题目理解错题意了,状态好差XD UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder A - Christmas Present 题意: 给出两个数B, G问哪个大 题解: 凑数…

华为笔记本matebook13_华为引领“第三代移动办公”新纪元 华为MateBook开启“智慧化办公”新赛道...

运营商财经网 康钊/文移动互联网的快速兴起,让办公形式不再受时间、地点的限制,笔记本电脑、平板电脑、手机等承担生产力工具作用的电子设备也是越来越多样化,“移动办公”正成为一种不断演化市场趋势。然而,随着移动…

IPv4地址和IPv6地址的比较,IPv6地址及其表示

IPv4地址和IPv6地址的比较,IPv6地址及其表示 TCP/IP协议是互联网发展的基石,其中IP是网络层协议,规范互联网中分组信息的交换和选路。目前采用的IPv4协议地址长度为32位,总数约43亿个IPv4地址已分配殆尽。 IPv6是IP地址的第六版…

MySQL如何有效的存储IP地址

文章目录序言工具类实现转换数据库函数实现转换一、IP地址应该怎么存二、整数存储 IP 地址的查询性能实验1、测试范围查询:2、IP精确查询:3、整理一下结果发现:总结首先就来阐明一下部分人得反问:为什么要问IP得知怎样存&#xff…

ab753变频器参数怎么拷贝到面板_变频器怎么设置参数?变频器的基本参数设定...

电工学习网:www.diangon.com技术驱动未来,关注电工学习网官方微信公众号“电工电气学习”,收获更多经验知识。变频器在工业生产中应用及其重要,其除了调速,软启动作用外,最重要的是可以节能。变频器功能参数…

卢克增加服务器,DNF卢克跨区服务器崩溃?策划:暗制造者临时加入安图恩攻坚...

原标题:DNF卢克跨区服务器崩溃?策划:暗制造者临时加入安图恩攻坚DNF作为一款即时在线,2d网络游戏,决斗场系统延伸到早期60级版本组队刷图。玩家与玩家之间互动,即时刷图跨区,成为了阿拉德大陆一…

使用TortoiseGit(小乌龟)操作分支的创建

现在的我的github库上面只有一个master分支 由于是穷屌丝用不起mac,所以我windows为例进行相应的演示: 下图就是本地使用小乌龟的版本管理工具在只有一个分支的情况下执行命令:Switch/Checkout 显示的内容。 下面分为三个步骤进行创建分支操…

计算机丢失d3dcompile,电脑d3dcompiler43.dll文件丢失怎么办 文件丢失解决方法

最近有位用户私信给小编,说他在使用电脑的时候,电脑一直弹出丢失d3dcompiler43.dll文件的弹窗。就算是关闭,下次开机依旧会弹出这样的窗口,十分厌烦。那丢失电脑中的d3dcompiler43.dll文件应该怎么办呢?其实也不难&…

mybatis plus 导出sql_软件更新丨mybatis-plus 3.0.7 发布,辞旧迎新

点击右上方,关注开源中国OSC头条号,获取最新技术资讯Mybatis-Plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件, 减少你的开发周期优化动态维护 XML 实体字段,无入侵全方位 ORM 辅助层让您拥有更多时间陪…