博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译和运行时的界限在哪儿?
阅读量:5084 次
发布时间:2019-06-13

本文共 1711 字,大约阅读时间需要 5 分钟。

两个概念:

一,编译单元:一个.java文件就是一个编译单元。一个.java文件会被编译成一个或多个.class文件。在eclipse等IDE中,默认自动编译,即,一旦.java文件被改动则重新编译并产生.class文件。

二,类的加载:一旦已运行的程序第一次访问一个类的静态数据或者创建一个类的对象时,jvm就会根据包名及类名到classpath下的对应文件夹中找到相应的.class文件将其加载到内存中,此时,程序进入运行时。

所以,编译期和运行时的物理边界是类的加载时。

如果一段程序在运行时每次执行都产生固定的结果,那么这段程序完全可以在编译时直接输出该结果,从而减轻运行时的压力。这是编译期和运行时的另一种边界。

三、绑定:将一个方法调用(既指向方法所在内存的引用)同一个方法主体(内存中的代码块)关联起来的过程。

//RandomTest.java文件中 public Class RandomTest {    private Random rand = new Random(47);    public int getRandomNum() {        return rand.nextInt(3);    }        }
//RandomInt.java文件中public Class RandomInt {    public static void main(String[] args) {        RandomTest rdt1 = new RandomTest();        RandomTest rdt2 = new RandomTest();        int randomNum1 = rdt1.getRandomNum();        int randomNum2 = rdt2.getRandomNum();        System.out.println(randomNum1);        System.out.println(randomNum2);    }} 输出:2      1

当main方法中的getRanomNum方法执行时,getRandomNum方法已经被编译完成了。但最终却产生了不同的结果,说明nextInt方法是在运行时才产生结果,而非编译时就产生结果。

一次编译、两次运行、两个结果。说明了在运行时才产生了最终的结果而非编译时。

//A.java中public class A {    public void m() {        System.out.print("A");    }}public class B extends A {    public void m() {        System.out.print("B");    }}public class C extends A {    public void m() {        System.out.print("C");    }}//Test.java中public class TestA {    public static void testA(A a) {        a.m();    }}public class Test {    public static void main(String[] args) {        TestA testA = new TestA();        B b = new B();        C c = new C();        testA(b);        testA(c);    }}输出:B     C

同理,对于TestA()方法来说,一次编译,两次执行,产生了两个结果。

说明,在编译TestA时,a.m()并没有指向具体的方法体(内存地址)。而是在运行时,jvm根据入参的类型,才将a.m()指向不同的方法体(内存地址)。

 

转载于:https://www.cnblogs.com/henrier/p/4550008.html

你可能感兴趣的文章
《奸的好人2》财色战场----笔记
查看>>
BZOJ 1834网络扩容题解
查看>>
bzoj1878
查看>>
【Vegas原创】Mysql绿色版安装方法
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
分享《去哪儿网》前端笔试题
查看>>
2013-07-04学习笔记二
查看>>
CP15 协处理器寄存器解读
查看>>
【codeforces 787B】Not Afraid
查看>>
【9111】高精度除法(高精度除高精度)
查看>>
【hihocoder 1312】搜索三·启发式搜索(普通广搜做法)
查看>>
JavaFX中ObservableValue类型
查看>>
杭电 1097 A hard puzzle
查看>>
[转载]INFORMIX锁机制及如何剖析其锁申辩(第二部门)
查看>>
Andriod-项目stymqjlb-学习笔记2-原型
查看>>
Web AppDomain
查看>>
JQuery创建规范插件
查看>>
AD 域服务简介(三)- Java 对 AD 域用户的增删改查操作
查看>>
Unity中Text渐变色,和Text间距
查看>>
P4932 浏览器
查看>>