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

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

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

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

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

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

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

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

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

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中,可以设计通过组合模式来尝试模拟下所谓的运行时继承。

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

JAVA之编译期和运行期区别相关推荐

  1. 编译期java_java编译期和运行期

    举个例子,当我们作为开发人员,在电脑上拼死拼活写了一个版本的代码,然后将代码提交到git上去,当我们用jekins或其他工具将代码从git上clone下来,使用mvn package,或者mvn in ...

  2. Java注解编译期处理AbstractProcessor详解

    文章目录 概述 注解处理器 注解处理流程 AbstractProcessor getSupportedOptions() getSupportedAnnotationTypes getSupporte ...

  3. 教妹学Java:Java 程序在编译期发生了什么?

    Java 程序在编译期发生了什么 "二哥,看了上一篇 Hello World 的程序后,我很好奇,它是怎么在 Run 面板里打印出'三妹,少看手机少打游戏,好好学,美美哒'呢?"三 ...

  4. Java 编译期与运行期,别傻傻分不清楚!

    来源:小小木的博客 www.cnblogs.com/wyc1994666/p/11366802.html 不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello ...

  5. 读书笔记 effective c++ Item 41 理解隐式接口和编译期多态

    1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态.举个例子,考虑下面的类(无意义的类), 1 class Widget { 2 public: 3 Widget(); 4 vi ...

  6. java程序编译_Java程序的编译过程

    Java的编译期是一个模糊的概念,需要具体分析. 将 *.java文件转为 *.class的过程称为编译器的前端(前端编译).例如:JDK的javac编译器. 把字节码( *.class文件) 转变为 ...

  7. java编译异常和运行时异常_浅谈异常结构图、编译期异常和运行期异常的区别...

    异常处理一般有2种方式,要么捕获异常try-catch,要么抛出异常throws 如果一个方法后面抛出一个运行时期异常(throws RuntimeException),调用者无须处理 如果一个方法后 ...

  8. 编译期 java.lang.IllegalArgumentException

    错误内容:Error:Module 'XXX' production: java.lang.IllegalArgumentException 主要是编译期都过不了,网上很多其他类似错误都是运行期错误 ...

  9. C++编译期多态与运行期多态

    前言 今日的C++不再是个单纯的"带类的C"语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分.在面向对象C++编程中, ...

最新文章

  1. 百度Q3财报里的“大生意”
  2. ITK:计算纹理特征
  3. 认清SQL_Server_2005的基于行版本控制的两种隔离级别
  4. c#简单类的继承【C#】
  5. 开启Mosquitto系统topic功能
  6. CentOS下MySQL主从同步配置
  7. php分享十七:http状态码
  8. 行业大佬集体唱衰教育O2O,强管控的B2C模式将是唯一出路
  9. 启动Tomcat出现Using CATALINA_BASE
  10. 数学_最小二乘法相关
  11. tar.gz和tar.bz2解压命令
  12. zabbix自定义监控之声音报警、用户和组权限
  13. 78M05-ASEMI三端正线性稳压器78M05
  14. seo关键词扩展-自动关键词拓展软件免费下载
  15. 为表的添加中文属性时出现的Incorrect string value: '\xE7\x9A\x84\xE6\xB1\xEA...
  16. ISO 8601规则
  17. 二、谈谈对数据库中索引的理解
  18. 攻防世界007 伪造xff_referer
  19. 计量经济学及Stata应用 第五章习题 5.7 使用回归模型进行餐馆选址。数据集Woody3.dta包含33家Woody‘s连锁餐馆的以下变量……
  20. Android studio 之 高级调试技巧,看这一篇够啦

热门文章

  1. java set是重复_java算法题,set内出现重复元素
  2. vue 左侧菜单隐藏_vue.js 左侧二级菜单显示与隐藏切换的实例代码
  3. 链接服务器访问接口返回了消息没有活动事务,因为链接服务器 SQLEHR 的 OLE DB 访问接口 SQLNCLI10 无法启动分布式事务。...
  4. JavaScript | 将十进制转换为十六进制,反之亦然
  5. 图解TCP三次握手和四次挥手!(简单易懂)
  6. 程序员专属精品简历合集—面试必备
  7. 生成文件的另一种思路——共享文件同步
  8. centos 8 安装使用配置
  9. 前端开发1之Node.js以及npm开发环境搭建
  10. HashMap的put方法(Java7)和putVal方法(Java8)