java学习笔记-理解java语言的跨平台
2015-12-17 12:44
579 查看
java程序程序可以跨平台,这是可以在很多书上都描述过的,了解跨平台之前,得先了解一下不能跨平台是怎么回事。
对于电脑来说,他只认识一种语言,也就是0101的二进制等序列所组成的指令。
对于c/c++程序,我们通常需要通过编译器将源程序编译为0101序列,但是不
同的操作系统上面他的二进制所组成的指令是不同的,如果我们把windows下编译好的文件放在linux上运行,由于指令不同而导致执行错误或者执行结果不正确。
我们的Java文件为hello.java,经过java编译器编译为hello.class。
然后由我们的java虚拟机将.class文件翻译为对应平台相依的语言,也就是机器码。
要想运行java程序,我们首先得安装jre(java runtime enviroment),由java虚拟机来运行java程序。对于不同的操作系统,我们得下载相应的jre。不同的平台jvm他们可以认识.class(字节码文件),然后不同的平台的jvm将会翻译.class文件为相应的机器指令.这样就相当于实现了java的跨平台。
有一个形象的例子说得很好:比方说你讲中文(java),java编译器帮你翻译为英文(.class),然后改英文文件,由java虚拟机翻译为对应平台的当地的原因。
对于java程序来说,他只认识一种系统,也就是java虚拟机。
java程序会引用标准程序库,也就是我们平常使用的java.lang.*,java.util.*l等提供的类都在标准程序库中。标准程序库及JVM,都包含在JRE之中。所以java程序要能够执行在电脑中,就必须安装JRE.
看到了几篇很好的文章,把java分析很透彻,很形象,在这里坐下笔记。原文地址:語言技術:Java Essence
在使用javac时,不指定classpath时,会读取环境变量参数中的classpath设定。当你显示指定classpath时,则会以classpath中的设定的路径为主。
jdk提供的API被打包为了rt.jar包,所以要想使用API提供的类我们需要在环境变量中设置classpath路径,以便编译器能够找到。
在编译的时候,会先去查看有无该类的源码文件,有的话在去查看有无该源码的class文件,没有的话,则去编译,有的话,则查看编译之后,源文件是否发生了改变,改变了的话,则重新编译。
与c/c++中的#include 不同,java只是去对应路径下去查看,并没有导入,使用import与没有使用import编译之后的文件并没有任何的区别。
编译器在编译java文件时,都会标示主版本好与此版本号,不用的版本号,则意味着不同是不同版本的jdk编译出来的,而.class文件的格式可能会不同。jvm在载入class文件时,会先检查版本号是否是可接受的范围内,否则不会处理该class文件。
可以在编译的时候这样使用,让他兼容低版本的jre
编译:javac -target 1.7 -source 1.7 HelloWorld.java
如果想在电脑上测试一下时可以指定版本
运行:java -version 1.7 HelloWorld
接著你又在H:\workspace下寫了一個Main.java:
接下来我们使用 javac -d H:\workspace Main.java 编译会发生错误,错误消息 程序包xinwa.obj不存在,可是我们已经指定了-d参数,不是应该自动生成对应的文件目录吗?
编译时,编译器会寻找俩个路径,一个是.java原始码所在的路径,一个是.class档案所在路径,也就是sourcepath与classpath,这俩个路径可以使用-classpath来设定,预计上,sourcepath与classpath默认是相等的.
无论在sourcepath与classpath中,xinwa,obj文件夹都不存在,由于找不到class文件,所以会先载入Message.java文件,但编译器发现其有package修饰,但又没有对应套件的资料夹,所以我们的建立相应的文件夹
我们还可以指定对应的目录,让生成的class文件放入对应的目录中
编译:H:\workspace>javac -sourcepath src -d classes src\Main.java
要自行建立文件是件很麻烦的事情,IDE可以方便的帮助我们减少工作量。
遗留问题:我的windows中并没有设置classpath,那么他是如何找到我的jdk中提供的API呢
上面这个类Some为package访问权限,data为public访问权限,但是data收到Some的约束,所以data的访问权限为package访问权限。
被proteced修饰的成员,可以被同一包下的其他类使用,可以被不同包下的其他子类使用
被private修饰的成员只能被本类中被使用
被public修饰的成员可以被所以成员存取
对于电脑来说,他只认识一种语言,也就是0101的二进制等序列所组成的指令。
对于c/c++程序,我们通常需要通过编译器将源程序编译为0101序列,但是不
同的操作系统上面他的二进制所组成的指令是不同的,如果我们把windows下编译好的文件放在linux上运行,由于指令不同而导致执行错误或者执行结果不正确。
我们的Java文件为hello.java,经过java编译器编译为hello.class。
然后由我们的java虚拟机将.class文件翻译为对应平台相依的语言,也就是机器码。
要想运行java程序,我们首先得安装jre(java runtime enviroment),由java虚拟机来运行java程序。对于不同的操作系统,我们得下载相应的jre。不同的平台jvm他们可以认识.class(字节码文件),然后不同的平台的jvm将会翻译.class文件为相应的机器指令.这样就相当于实现了java的跨平台。
有一个形象的例子说得很好:比方说你讲中文(java),java编译器帮你翻译为英文(.class),然后改英文文件,由java虚拟机翻译为对应平台的当地的原因。
对于java程序来说,他只认识一种系统,也就是java虚拟机。
java程序会引用标准程序库,也就是我们平常使用的java.lang.*,java.util.*l等提供的类都在标准程序库中。标准程序库及JVM,都包含在JRE之中。所以java程序要能够执行在电脑中,就必须安装JRE.
看到了几篇很好的文章,把java分析很透彻,很形象,在这里坐下笔记。原文地址:語言技術:Java Essence
PATH是什么?
path是当你在命令行中键入命令时,系统首先会查看path中路径下是否包含该程序,有的话就执行。CLASSPATH 是什么?
当jvm执行某个class文件时,jvm会根据classpath中的路径来指定寻找对应的class文件,在编译的时候也需要指定classpath.在使用javac时,不指定classpath时,会读取环境变量参数中的classpath设定。当你显示指定classpath时,则会以classpath中的设定的路径为主。
jdk提供的API被打包为了rt.jar包,所以要想使用API提供的类我们需要在环境变量中设置classpath路径,以便编译器能够找到。
使用package 分类管理
package 为关键字,可以让你做类的分类管理,当类处于包下,则它的完整路径名为: 包的路径+类名使用import
使用import可以减少我们在使用包管理下的类时,必须得写完整的路径名称,使用import时,当编译器遇到其他类名时,会先去当前路径下寻找有无当前类,如果没有的话,在去查看import,与类组合的方式,去对应路径下寻找。在编译的时候,会先去查看有无该类的源码文件,有的话在去查看有无该源码的class文件,没有的话,则去编译,有的话,则查看编译之后,源文件是否发生了改变,改变了的话,则重新编译。
与c/c++中的#include 不同,java只是去对应路径下去查看,并没有导入,使用import与没有使用import编译之后的文件并没有任何的区别。
高版本的程序如何在低版本下使用
举个例子,你使用的是jdk8来写的程序,而你的客户使用的是jre7,如果你把编译好之后的class文件交给客户,就会发现无法运行。编译器在编译java文件时,都会标示主版本好与此版本号,不用的版本号,则意味着不同是不同版本的jdk编译出来的,而.class文件的格式可能会不同。jvm在载入class文件时,会先检查版本号是否是可接受的范围内,否则不会处理该class文件。
可以在编译的时候这样使用,让他兼容低版本的jre
编译:javac -target 1.7 -source 1.7 HelloWorld.java
如果想在电脑上测试一下时可以指定版本
运行:java -version 1.7 HelloWorld
package与sourcepath,classpath
在H:\workspace 下有个message.javapackage xinwa.obj; public class Message { private String message; public void setMessage(String message) { this.message = message; } public String getMessage() { return message; } }
接著你又在H:\workspace下寫了一個Main.java:
import xinwa.obj.Message; public class Main { public static void main(String[] args) { Message message = new Message(); } }
接下来我们使用 javac -d H:\workspace Main.java 编译会发生错误,错误消息 程序包xinwa.obj不存在,可是我们已经指定了-d参数,不是应该自动生成对应的文件目录吗?
编译时,编译器会寻找俩个路径,一个是.java原始码所在的路径,一个是.class档案所在路径,也就是sourcepath与classpath,这俩个路径可以使用-classpath来设定,预计上,sourcepath与classpath默认是相等的.
无论在sourcepath与classpath中,xinwa,obj文件夹都不存在,由于找不到class文件,所以会先载入Message.java文件,但编译器发现其有package修饰,但又没有对应套件的资料夹,所以我们的建立相应的文件夹
我们还可以指定对应的目录,让生成的class文件放入对应的目录中
编译:H:\workspace>javac -sourcepath src -d classes src\Main.java
要自行建立文件是件很麻烦的事情,IDE可以方便的帮助我们减少工作量。
遗留问题:我的windows中并没有设置classpath,那么他是如何找到我的jdk中提供的API呢
使用JAR打包classs文件
基本上,在开发完程序之后,并不会直接把一堆class文件直接交出去,而是将之封装为jar文件。jar文件采用zip压缩格式。使用package存取与修饰
class Some { public int data; }
上面这个类Some为package访问权限,data为public访问权限,但是data收到Some的约束,所以data的访问权限为package访问权限。
被proteced修饰的成员,可以被同一包下的其他类使用,可以被不同包下的其他子类使用
被private修饰的成员只能被本类中被使用
被public修饰的成员可以被所以成员存取
相关文章推荐
- Java线程:概念与原理
- 【Java EE 学习 72 下】【数据采集系统第四天】【移动/复制页分析】【使用串行化技术实现深度复制】
- java.lang.UnsatisfiedLinkError: Native Library * already loaded in another classloader
- SpringMVC——接收请求参数和页面传参
- 轻量级JavaEE企业应用实战(六)
- Java 斐波那契数列
- 深入理解Java的接口和抽象类(转载---写的非常好~)
- Spring数据源配置总结
- java学习路线
- Java之多线程内存可见性_2(synchronized实现可见性代码)
- 用eclipse创建maven项目老是出现这个错误 'Creating maven-archetype-quickstart' has encountered
- maven 指定java编译环境
- JAVA 泛型实现原理及使用详解
- MQTT在eclipse Paho向Android推送
- 简化的RxJava
- java web应用文件下载(包括中文文件名乱码处理)
- 【基于shiro的分布式权限管理系统】一个用Java、spring、mybatis和shiro开发的分布式权限管理系统
- eclipse中配置git,以及eclipse中上传代码到github上
- LRU (Least Recently Used) 算法的Java实现
- java swing给按钮添加快捷键