java编译时与运行时概念与实例详解

发布于 2020-7-29|

复制链接

本篇文章通过实例对 java程序编译时与运行时进行了详解,需要的朋友可以参考下

Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念.基础概念编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)

那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.所以有时一些人说编译时还分配内存啥的肯定是错误的说法.运行时

所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.(这样很多编译时无法发现的错误,在运行就可以发现报错了,最好还是写的的时候就避免这个逻辑错误就好了)举列子

```java

int arr[] = {1,2,3};

int result = arr[4];

System.out.println(result);

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4

```

上面的代码你一瞧你知道是错误的代码,数组越界了.但用编译器没有报错,run后才出现了ArrayIndexOutOfBoundsException.可见编译器其实还是挺笨的,还没你脑瓜子那么聪明啊,于是你想虽然编译器笨了点,但运行起来时发现了错误也还不算太坏.面试题

```java

理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。

Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢?

public class ConstantFolding {

static final int number1 = 5;

static final int number2 = 6;

static int number3 = 5;

static int number4= 6;

public static void main(String[ ] args) {

int product1 = number1 * number2; //line A

int product2 = number3 * number4; //line B

}

}

```

A.在行A的代码中,product的值是在编译期计算的,行B则是在运行时计算的。如果你使用Java反编译器(例如,jd-gui)来反编译ConstantFolding.class文件的话,那么你就会从下面的结果里得到答案。

```java

public class ConstantFolding

{

static final int number1 = 5;

static final int number2 = 6;

static int number3 = 5;

static int number4 = 6;

public static void main(String[ ] args)

{

int product1 = 30;

int product2 = number3 * number4;

}

}

```

常量折叠是种Java编译器使用的优化技术。由于final变量的值不会改变,因此就可以对它们优化。Java反编译器和javap命令都是查看编译后的代码(例如,字节码)的利器。方法重载:这个是发生在编译时的。方法重载也被称为编译时多态,因为编译器可以根据参数的类型来选择使用哪个方法。

```java

public class {

public static void evaluate(String param1); // method #1

public static void evaluate(int param1); // method #2

}

```

如果编译器要编译下面的语句的话:1evaluate(“My Test Argument passed to param1”);

它会根据传入的参数是字符串常量,生成调用#1方法的字节码方法覆盖:这个是在运行时发生的。方法重载被称为运行时多态,因为在编译期编译器不知道并且没法知道该去调用哪个方法。JVM会在代码运行的时候做出决定。

```java

public class A {

public int compute(int input) { //method #3

return 3 * input;

}

}

public class B extends A {

@Override

public int compute(int input) { //method #4

return 4 * input;

}

}

```

子类B中的compute(..)方法重写了父类的compute(..)方法。如果编译器遇到下面的代码:

```java

public int evaluate(A reference, int arg2) {

int result = reference.compute(arg2);

}

```

编译器是没法知道传入的参数reference的类型是A还是B。因此,只能够在运行时,根据赋给输入变量“reference”的对象的类型(例如,A或者B的实例)来决定调用方法#3还是方法#4泛型(又称类型检验):这个是发生在编译期的。编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码。这个技术被称为“类型擦除“。换句话来说,编译器会擦除所有在尖括号里的类型信息,来保证和版本1.4.0或者更早版本的JRE的兼容性。1List myList = new ArrayList(10);

编译后成为了:1List myList = new ArrayList(10);

异常(Exception):你可以使用运行时异常或者编译时异常。运行时异常(RuntimeException)也称作未检测的异常(unchecked exception),这表示这种异常不需要编译器来检测。RuntimeException是所有可以在运行时抛出的异常的父类。一个方法除要捕获异常外,如果它执行的时候可能会抛出RuntimeException的子类,那么它就不需要用throw语句来声明抛出的异常。

例如:NullPointerException,ArrayIndexOutOfBoundsException,等等

java编译不报错但运行啥都没_java编译时与运行时概念与实例详解相关推荐

  1. java运行时_java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...

  2. java构造方法重载_Java 重载、重写、构造函数的实例详解

    Java 重载.重写.构造函数的实例详解 方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定 ...

  3. java objectoutputstream怎么用_java序列化与ObjectOutputStream和ObjectInputStream的实例详解...

    java序列化与ObjectOutputStream和ObjectInputStream的实例详解 一个测试的实体类: public class Param implements Serializab ...

  4. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  5. wxml报错原因_微信小程序开发教程(八)视图层——.wxml详解

    框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示. 对于微信小程序而言,视图层就是所有.wxml文件与.w ...

  6. java 定义抽象变量_Java抽象类和抽象方法定义与用法实例详解

    本文实例讲述了Java抽象类和抽象方法定义与用法.分享给大家供大家参考,具体如下: 一.Java抽象类 1.抽象类的说明 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都 ...

  7. java 数组求和_java 实现随机数组输出及求和实例详解

    导读热词 java 实现随机数组输出及求和 问题描述: 随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路: 使用java.util中的 ...

  8. websocket java 例子_java 实现websocket的两种方式实例详解

    目录 一.介绍 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring ...

  9. java mysql教程基于_java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JD ...

最新文章

  1. 追番必备,动漫角色也可以用人脸识别了
  2. css3 -webkit-filter
  3. WINCE viewbin命令
  4. 【项目管理】采购管理
  5. 关于我在学习Javaweb时对Linux服务器安装配置jdk,tomcat,mysql的一些学习心得
  6. Python的列表推倒式、生成器及迭代器
  7. CS190.1x Scalable Machine Learning
  8. 让窗体接受拖放, 并获取拖过来的文件信息 - 回复 海浪问 的问题
  9. 解决win7下PIL无法打开图片的问题
  10. html5块注释,HTML 块引用标签
  11. Vdbench工具安装使用
  12. xampp中mysql使用教程_XAMPP的安装及使用教程
  13. 原码一位乘的数值运算
  14. 硬盘数据恢复——误删除卷数据恢复
  15. 什么是BOM?BOM和DOM的区别
  16. Shell 通过sed替换文件字符串
  17. 让 P-value 更加的浅显易懂
  18. 电音(5)Bass类电音
  19. 临时链接转为永久链接的三种方法
  20. Spring自动装配及自动注入

热门文章

  1. Linux Mount命令浅解
  2. CoreData的数据迁移
  3. 对CSRF(跨站请求伪造)的理解
  4. jquery radio/checkbox change 事件不能触发的问题
  5. 你真的理解clear:both吗?
  6. 更新导致Svchost CPU100%(转)
  7. 386 · Longest Substring with At Most K Distinct Characters最多有k个不同字符的最长子字符串
  8. android 获取录音时长_录音转文字,支持安卓和IOS和PC
  9. mysql简单部署_Docker部署简单的mysql
  10. excel手机版_手机自带便签如何导入新手机?试试这款便签同步助手