java中的编译时与运行时

凉月缘      2022-04-18     229

关键词:

----?基础知识

    -- 编译时

    编译器将源代码翻译成机器能够读懂的代码,如java中就是翻译成jvm能够读懂的字节码文件。简单说,编译时就是机器帮我们检查代码是否有出现语法错误,关键字写错之类的,是为之后的类加载做好准备,所以,在这个过程中并不会出现什么分配内存之类的操作。

   -- 运行时

    这个过程是指将编译好后的储存在磁盘上的字节码文件(.class文件)加入到内存中运行,在运行的过程中,会进行一系列的类型检查,如空间内存分配,逻辑判断之类的。因此,在这个过程中经常会出现一些我们无法预知的错误。

---- 举个栗子

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
 
 }
 
}

--- 分析

    同时被static和final修饰的常量称作编译时常量,所以number1 和 number2在编译时已经被加载了,即product1 在编译期间就已经确定好了值为多少。而number3 和number4 只有在运行时,分配好了内存空间并且才能被成功赋值,所以product2 的值只有在运行时才能够确定是多少。反编译如下:

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;
 }
}

 

---- 举个栗子

   方法的重载:这个是发生在编译时的。方法重载也被称为编译时多态,因为编译器可以根据参数的类型来选择使用哪个方法。

public class Test{
 public static void A(String param1); // method #1
 public static void A(int param1); // method #2
}

   如果编译器调用的方法是下面

new Test().A("classlodaer");

   那么它就会在编译的时候自己去寻找menthod #1的方法

 

---- 举个栗子

   方法覆盖:这个是在运行时发生的。方法重载被称为运行时多态,因为在编译期编译器不知道并且没法知道该去调用哪个方法。JVM会在代码运行的时候做出决定。

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;
 } 
}

   如果编译器遇到如下代码,就在编译时就无法判断究竟传入的参数是A类型还是B类型,只有在运行时才能够进行确定,进而来判断要调用方法#3还是#4

public int evaluate(A reference, int arg2) {
 int result = reference.compute(arg2);
}

 

---- 举个栗子

  泛型(又称类型检验):这个是发生在编译期的。编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码。这个技术被称为“类型擦除“。

    public class Test4 {
        public static void main(String[] args) {
            ArrayList<String> arrayList1=new ArrayList<String>();
            arrayList1.add("abc");
            ArrayList<Integer> arrayList2=new ArrayList<Integer>();
            arrayList2.add(123);
            System.out.println(arrayList1.getClass()==arrayList2.getClass());
        }
    }

---- 分析

   在这个例子中,我们定义了两个ArrayList数组,不过一个是ArrayList<String>泛型类型,只能存储字符串。一个是ArrayList<Integer>泛型类型,只能存储整形。最后,我们通过arrayList1对象和arrayList2对象的getClass方法获取它们的类的信息,最后发现结果为true。说明泛型类型String和Integer都被擦除掉了,只剩下了原始类型

 

---- 举个栗子

  异常:分为编译时异常和运行时异常

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

   例如:NullPointerException,ArrayIndexOutOfBoundsException,等等

  受检查异常(checked exception)都是编译器在编译时进行校验的,也称为编译时异常,通过throws语句或者try{}cathch{} 语句块来处理检测异常。编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。

 

javascriptxpath命令不会在每次运行时与seleniumjava程序混合运行

以下javascript(与Java在Selenium中混合在一起)未成功运行xpath命令每次运行。但是我的Java命令成功运行,这是我遇到问题的xpath。(换句话说,有时xpath命令成功运行,而在其他时候则没有)。我将jdk从13更改为jdk8,但这没有用。... 查看详情

为 ARM 交叉编译应用程序时与 sdl 链接时出错

】为ARM交叉编译应用程序时与sdl链接时出错【英文标题】:errorlinkingwithsdlwhilecrosscompilingapplicationforARM【发布时间】:2011-02-2021:01:25【问题描述】:我正在尝试为ARM处理器交叉编译简单的SDL应用程序。我正在使用带有IntelXscalePX27xr... 查看详情

带有触发器的 WPF 设计时与运行时样式差异

】带有触发器的WPF设计时与运行时样式差异【英文标题】:WPFDesign-TimevsRun-TimeStyleDifferenceswithTriggers【发布时间】:2011-06-0313:03:51【问题描述】:我对如何在设计时与运行时呈现XAML有一个大问题。在大多数情况下,事情是一致的... 查看详情

动态朗。运行时与反射

】动态朗。运行时与反射【英文标题】:DynamicLang.RuntimevsReflection【发布时间】:2011-06-0612:23:36【问题描述】:我打算为我的新项目使用动态关键字。但在介入之前,我想了解使用动态关键字而不是反射的利弊。根据优点,我可... 查看详情

自定义键盘扩展可以在运行时与配套应用程序通信吗?

】自定义键盘扩展可以在运行时与配套应用程序通信吗?【英文标题】:Canacustomkeyboardextensioncommunicatewiththecompanionappatruntime?【发布时间】:2014-07-2420:46:43【问题描述】:自定义键盘能否在运行时与配套应用程序通信?自定义键... 查看详情

程序编译后运行时的内存分配

...载的来源:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html一、编译时与运行时的内存情况1.编译时不分配内存编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看... 查看详情

程序编译后运行时的内存分配

...转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html一、编译时与运行时的内存情况1.编译时不分配内存编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看... 查看详情

为啥在构建新应用程序时与刚刚重新启动或登录时数据库快照循环会运行太多循环?

】为啥在构建新应用程序时与刚刚重新启动或登录时数据库快照循环会运行太多循环?【英文标题】:Whywoulddatabasesnapshotloopsrunfartoomanyloopswhenappisbuiltnewvswhenjustrestartedorloggedin?为什么在构建新应用程序时与刚刚重新启动或登录时... 查看详情

容器运行时与k8s概述(代码片段)

容器运行时与k8s概述首先我们要明确一个知识点就是容器本质上就是一个进程,一个特殊的进程,是通过Namespace实现资源(网络、文件系统等)隔离,通过Cgroups实现资源(CPU、内存)限制,让我们... 查看详情

flink1.13,面向流批一体的运行时与datastreamapi优化

...月22日在北京站FlinkMeetup分享的《面向流批一体的Flink运行时与DataStreamAPI优化》。内容包括:回顾Flink流批一体的设计介绍针对运行时的优化点介绍针对DataStreamAPI的优化点总结以及后续的一些规划Tips:点击文末「阅读原文... 查看详情

将 Bref Lambda 自定义运行时与 AWS CDK 一起使用时出现错误 libncurses.so.6

】将BrefLambda自定义运行时与AWSCDK一起使用时出现错误libncurses.so.6【英文标题】:Errorlibncurses.so.6whenusingBrefLambdacustomruntimewithAWSCDK【发布时间】:2021-07-0714:03:49【问题描述】:我正在尝试使用AWSCDK而不是Serverless在AWSLambda中使用Bref... 查看详情

在运行时与 VB.NET LIKE 运算符进行大小写(不)敏感比较(无选项比较)

】在运行时与VB.NETLIKE运算符进行大小写(不)敏感比较(无选项比较)【英文标题】:Case(in)sensitivecomparisonwithVB.NETLIKEoperatorinruntime(withoutOptionCompare)【发布时间】:2011-06-2423:28:18【问题描述】:在运行时是否可以在VB.NET中使用LIK... 查看详情

Java bayeux 客户端在空闲时与 TimeoutException 断开连接

】Javabayeux客户端在空闲时与TimeoutException断开连接【英文标题】:JavabayeuxclientdisconnectswithTimeoutExceptionwhenidle【发布时间】:2019-07-1407:54:54【问题描述】:我正在初始化Bayeux客户端:SslContextFactorysslContextFactory=newSslContextFactory(true);H... 查看详情

运行时的 C++ 字符串文字转换 [关闭]

...时间】:2021-08-2317:09:48【问题描述】:我有一个关于C++中编译时与运行时字符串文字的问题。在编译时,创建一个字符串文字并(例如)传递给正则表达式处理器std::stringpattern="a\\\\d+"导致“后编译”字符序列\'a\'\'\\\'\'d\'\'+\'\'\ 查看详情

UISearchBar 在活动时与 UITableView 内容重叠

】UISearchBar在活动时与UITableView内容重叠【英文标题】:UISearchBaroverlapswithUITableViewcontentwhenactive【发布时间】:2016-05-0222:58:26【问题描述】:我有一个带有表格视图和UISearchController的视图控制器。运行应用程序时,我发现搜索栏... 查看详情

java编译时注解和运行时注解有啥区别

...法,相反的,只有在jvm执行过程中,才知晓到底是父子类中的哪个方法被调用了当有如下一个接口的时候,我们是无法确定到底是调用父类还是子类的方法3.泛型(类型检测),这个发生在编译时。编译器会在编译时对泛型类型进... 查看详情

将外部 JS 引擎添加到 Eclipse 运行时以在 Java 15 中使用 Eclipse Java 编译器和 Ant 中的 <script>

...擎添加到Eclipse运行时以在Java15中使用EclipseJava编译器和Ant中的<script>【英文标题】:AddexternalJSenginetoEclipseruntimetouseEclipseJavaCompilerand<script>inAntinJava15【发布时间】:2021-07-0918:42:35【问题描述】:我有一个带有一些&lt;scr... 查看详情

java学习笔记3.10.1异常处理-异常类型

...习目标一、异常概念(一)程序异常及解决方法1、生活中的异常2、程序中的异常3、程序异常解决方法(二)Java异常体系结构1、Exception——异常2、Error——错误(三)Throwable类常用方法二、异常类型(一)编译时异常1、编译时... 查看详情