java学习笔记-理解java语言的跨平台

来源:互联网 发布:logo自制软件中文版 编辑:程序博客网 时间:2024/06/07 01:28

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

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.java

package 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修饰的成员可以被所以成员存取

0 0
原创粉丝点击