社区
非技术区
帖子详情
JAVA 语言类型
AlsoCrazy
2015-10-16 07:23:54
最近看到很多人说JAVA是解释性语言。可在我印象中只有脚本才是解释性语言。java也是要编译成机械码,只不过是在JVM上运行。所以我印象中java一直是编译性语言。是不是我的理解错了?
...全文
75
2
打赏
收藏
JAVA 语言类型
最近看到很多人说JAVA是解释性语言。可在我印象中只有脚本才是解释性语言。java也是要编译成机械码,只不过是在JVM上运行。所以我印象中java一直是编译性语言。是不是我的理解错了?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qqwwa1
2015-10-18
打赏
举报
回复
引用的网络资源。感觉会用帮助 在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode)(class文件的内容),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 *.java→*.class→机器码 java编译器 (编译) → 虚拟机(解释执行) → 解释器(翻译) → 机器码 Java虚拟机(JVM) Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。 Java中,类加载器把一个类装入JAVA虚拟机需要经过三个步骤来完成:装载、链接、初始化,其中链接又分来校验、准备、解析过程 装载:查找和导入.class文件 链接:检查装入.class文件的正确性,然后,java虚拟机为变量分配内存,设置默认值 初始化:把符号引用变成直接引用。。。 View Code 现在假设这两个java源文件已经被编译成了CLASS文件了,我们来看看java虚拟机怎么执行的。 Java虚拟机工作流程: 1.装载 描叙:Java虚拟机装载指定的CLASS文件 结果:形成这个CLASS类的实例对象 过程:java虚拟机使用类装载器定位到相应的CLASS文件,然后读取这个CLASS文件(一个线性二进制数据流),将它传入java虚拟机中。紧接着虚拟机提取其中的类型信息。比如:该类的类名,方法名,变量名,修饰符,方法的返回类型等等。还有一个重要的东西就是常量池。(常量池保存了该类型的所有常量,包括直接常量和对其他类型,字段,方法的符号引用)将这些信息保存在一个叫做方法区的地方。最终形成CLASS类的实例,这个实例存放在内存的堆区。它成为了java程序与内部数据结构之间的接口,程序要访问该类型的信息,程序就调用该类型对应的CLASS实例对象的方法。简而言之:这个过程就是把一个类型的二进制数据解析为方法区中的内部数据结构,并在堆上建立一个CLASS对象的过程。 示例:装载Main类 Java虚拟机读取Main类的CLASS文件,生产对应的java.lang.Class类的实例,读取其中的类型信息,比如修饰符 private,public,static,另外变量 size,name,pwd,User(User即为一个引用)共同构成了这个类的常量池。将这些信息保存在方法区, 2.链接 描述:验证,准备,解析(可选) 结果:这个类型是正确的。(这里不知道该怎么描述) 过程: 1)验证:确定类型符合java语言的语义,比如:final类不能有子类,final方法不能被覆盖,确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有同样的名字,参数完全相同,但返回类型不同)。 2)准备:java虚拟机为类变量分配内存,设置默认值 3)解析:在类型的常量池中寻找类,接口,字段和方法的符合引用把这些符号引用替换成直接引用的过程。 示例: 连接Main类 Java虚拟机为size分配内存,并赋默认值0.找到常量池中User类的引用,如果User类还没有被装载,则装载并且连接该类,然后将常量池中对User类的引用替换为直接引用。在此时User类并不会被初始化,因为还没有用它。 3.初始化 描述:初始化一些静态变量 结果:这个类型可以使用了 过程:可能会调用()方法,(这个方法只能够由java虚拟机调用)来初始化该类的静态变量。在调用这个方法前,必须确认该类的超类的() 方法已经被调用。 示例:初始化Main类 Java虚拟机将Main类的静态变量赋值为1. 4.使用(执行该类代码了) 1.User u = new User();(存放在内存的堆区) 创建了一个User类实例,实际上是通过这个类的CLASS实例实例化的。方法如下: User u=(User)Class.forName("User").newInstance(); 为了方便,用C代替Class.forName("User") 2.u.setName("李文水"); u.setPwd("159"); 调用该类的方法,为该类的变量赋值,Java虚拟机内部调用是这样的,通过方法区找到该方法,利用CLASS实例的如下方法调用: c.getMethod("setName").invoke(u,"李文水"); 3.String name = u.getName(); String pwd = u.getPwd(); 与第二步类似,不同的是将取得的值分别赋给了变量name和pwd。关键是这个值保存在哪里?和实例对象一样,存放在堆区。这个时候我应该可以看出CLASS实例的作用了,它就是起个中间作用,将程序中的调用反应到堆区上数据的变化。 4.u = null; 这个步骤写出来的目的是了解一下Java虚拟机垃圾回收机制。(没有什么实际意义) Java虚拟机内部会根据一种规则(这个对象是否可以触及)来判断这两个类是否可以回收了?具体形式如下: 当执行 u = null;时这条线就被斩断了,因此User实例就不可以触及了,所以java虚拟机就可以回收这个User实例了
子启
2015-10-16
打赏
举报
回复
Java本身是编译型语言,但某些情况下,为提升运行效率或者在特殊场景,可以解释性执行
相关推荐
java
是静态
语言
还是动态_
java
是动态
语言
还是静态
语言
?,
java
是动态
语言
还是静态
语言
?
Java
是动态
语言
还是静态
语言
?,
Java
是一种静态
语言
。
Java
是编译时确定的变量
类型
,不能在运行时更改,在
类型
转换中也是强制的。例如,当大规模整数
类型
转换为小规模整数
类型
时,必须进行强转换。比如int必须强制转换才能得到小规模的
类型
字节;所以
Java
是一种静态的强
类型
语言
。推荐研究:《编程视频课程》
Java
是动态
语言
还是静态
语言
,是强
类型
还是弱
类型
?虽然我知道,...
【深入
Java
虚拟机】之八动态
类型
语言
支持
这篇博客是根据《深入理解
java
虚拟机》的讲解和本人对动态
类型
语言
的一些认识,来深度剖析一下
java
虚拟机对动态
类型
语言
的支持! JDK存在js执行引擎 (一)什么是动态
类型
语言
在讲解
java
虚拟机对动态
类型
语言
支持之前,我们首先要弄明白动态
类型
语言
是什么?它与
java
语言
、
java
虚拟机有什么关系? 那么...
一,
Java
发展史和环境搭建
C & C++ 对C & C++ 的改进
Java
初生
Java
发展
Java
特性和优势 动态
类型
语言
和静态
类型
语言
动态
类型
语言
和静态
类型
语言
两者的区别就在于对
类型
的检查是在编译期还是在运行期,满足前者就是静态
类型
语言
,反之是动态
类型
语言
。说的在直白一点就是静态
类型
语言
是判断变量自身的
类型
信息;动态
类型
语言
是判断变量值的
类型
信息,变量没有
类型
信息,变量值才有
类型
信息,这是动态
语言
的一个重要特征。
Java
7中增加的动态
语言
类型
支持的本质是对
java
虚拟机规范的修改,而不是对JAV
[JVM]虚拟机动态
类型
语言
支持
这篇博客是根据《深入理解
java
虚拟机》的讲解和本人对动态
类型
语言
的一些认识,来深度剖析一下
java
虚拟机对动态
类型
语言
的支持! JDK存在js执行引擎 (一)什么是动态
类型
语言
在讲解
java
虚拟机对动态
类型
语言
支持之前,我们首先要弄明白动态
类型
语言
是什么?它与
java
语言
、
java
虚拟机有什么关系? 那么接下来先回答第一个问题,什么是动态
类型
语言
:动态
类型
语言
的关键特征是它的
类型
检查的...
java
的
语言
特性
一.
java
是一种静态
类型
语言
首先需要区别一下静态
类型
语言
和动态
类型
语言
: 静态
类型
语言
:编译时变量的数据
类型
即可确定的
语言
,多数静态
类型
语言
在变量使用之前就要声明数据
类型
(如c/c++/c#/
java
) 动态
类型
语言
:运行时确定数据
类型
的
语言
,动态
类型
语言
在变量使用之前无需声明其数据
类型
(vb/python) 二.
java
是一种强
类型
语言
辨析一下强
类型
语言
与弱
类型
语言
: 强
类型
非技术区
23,405
社区成员
70,758
社区内容
发帖
与我相关
我的任务
非技术区
Java 非技术区
复制链接
扫一扫
分享
社区描述
Java 非技术区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告