• Java 笔记 —— java 和 javac


    Java 笔记 —— java 和 javac

    一、Java JDK 安装

    1)JDK 在安装的过程中会出现两次安装提示,第 1 次是安装 JDK ,第 2 次是安装 JRE。我把 JDK 安装在 D:Javajdk 这个路径下,把 JRE 安装在 D:Javajre 这个路径下

    2)在配置 PAHT 和 CLASSPATH 的值时,是对 JDK 安装路径的配置,与 JRE 安装路径无关(当然这只是一般情况下)

    二、PATH

    1) PATH 要配置的路径是:;D:Javajdkin;D:Javajdkjrein(这里配置了两个路径,英文分号是每个路径的分隔符)。通常我们会增加一个变量 JAVA_HOME,它的值配置为:D:Javajdk(注意这里不用分号开头,也不用分号结尾),因此 PATH 的值通常配置为:;%JAVA_HOME%in;%JAVA_HOME%jrein

    2)添加 JAVA_HOME 变量的好处:当我重新安装 JDK 的时候,如果我想改变 JDK 的安装路径为 E:Javajdk ,当我没有配置 JAVA_HOME 时,我必须一个一个地去更改 PATH 的值,比如改为 ;E:Javajdkin;E:Javajrein ,但是如果我有配置 JAVA_HOME 的值,那我只需更改 JAVA_HOME 的值为 E:Javajdk 就行了,PATH 的值可以保持不变

    3)配置 PATH 环境变量的作用:我们用命令行编译运行 Java 程序时,会经常用到 java 和 javac 这两个命令,当我们还没设定 PATH 的值的时候,这两个命令是没办法在命令行的任意文件目录下执行的,那么配置 PATH 值就是为了让这两个命令可以执行

    4)java 和 javac 命令的工作原理:我们到 jdk 的安装路径下可以看到有一个 bin 文件夹,进入 bin 文件夹里面会发现 java 和 javac 就在这里。java 和 javac 都是 .exe 程序,在命令行中如果想要执行 .exe 程序,那么必须要从命令行进入到放置 .exe 程序的目录下,我们可以在命令行中输入 cd   /d   D:Javajdkin 命令,然后命令行会进入 bin 文件目录下,这时,即使我们没有配置 PATH 的值,也可以执行 java 和 javac 命令,可以在命令行输入 java   -version 命令试试。但是如果我们想在命令行的任何目录下都能执行 java 和 javac 命令那该怎么办呢?显然,要配置 PATH 的值。当我们执行 java 命令时,系统首先会在当前目录下寻找是否有 java.exe 程序,有,那么就执行,没有,那么就会去 PATH 里面寻找,所以,当我们配置好 PATH 之后,在任何目录下执行 java 和 javac 都会生效

    三、CLASSPATH

    1)CLASSPATH 的值:.;%JAVA_HOME%lib;%JAVA_HOME%lib ools.jar(这里配置了 3 个路径,其中 . 符号表示本地路径,其他两个路径都可以在 JDK 的安装路径下面找到)

    2)配置 CLASSPATH 的作用:寻找 .class 文件。例如:如果我有个 Java 程序在 E:Example 路径下,文件名称为 Test.java 。要编译程序,那首先要将命令行切换到 E:Example 目录(在命令行处输入命令 cd   /d   E:Example), 然后执行 javac   Test.java 命令将 .java 文件编译成 .class 文件。没有配置 CLASSPATH 时:我们可以直接在命令行的 E:Example 目录下执行 java   Test 命令,能够执行成功的原因是在没有配置 CLASSPATH 时,系统会默认在本地目录下寻找编译后的 Test.class 文件。有配置 CLASSPATH 时:假如我随便在 CLASSPATH 中添加一个路径 F:; ,那么系统便不会默认在本地目录下寻找,这时我们也想要在命令行的 E:Example 目录下执行 java   Test 命令,则 CLASSPATH 应该配置成 .;F:;( . 符号就表示本地目录)

    3)再举个例子:我的 CLASSPATH 已经配置成: .;%JAVA_HOME%lib;%JAVA_HOME%lib ools.jar ,现在我将编译好的 Test.class 文件放在 D:ExampleClass 路径下,那么我想要在命令行中执行 java   Test 命令要怎么办呢?有两种方法,第一种方法:我将命令行切换到 D:ExampleClass 目录下,然后可以直接执行 java Test 命令(因为 CLASSPATH 配置了 . 符号,能在本地目录下寻找 Test.class 文件)。第二种方法:将 D:ExampleClass 路径添加到 CLASSPATH 中,即 .;%JAVA_HOME%lib;%JAVA_HOME%lib ools.jar;D:ExampleClass ,这时我们就可以在命令行中的任何目录下执行 java Test

    四、小结

    1)配置 PATH 是为了使 java 和 javac 命令能在命令行的任何目录下执行

    2)配置 CLASSPATH 是为了执行 java   Test 命令时,能够找到 Test.class 文件

    3)PATH 和 CLASSPATH 的配置都与 JDK 的安装路径有关,与 JRE 的安装路径无关(当然这只是一般情况下)

    4)向 CLASSPATH 添加指定路径之后可以使 java   Test 在命令行的任何目录下执行;使用绝对路径可以使 javac   E:ExampleTest.java 在命令行的任何目录下执行

    五、javac 命令

    1. 格式:javac [options] [source files]
    2. 常用的 options 有:
      • -d   <目录> ,该选项用于编译时将 .class 和 .java 文件分开存放
      • -sourcepath   <路径> ,该选项用于编译时指定 .java 文件的位置
      • -classpath   <路径> ,该选项用于编译时指定 .class 文件的位置
    3. 用法

    无 options

    假设 D:sources 路径下有一个文件名为 Test.java 的文件。

    例如:javac   D:sourcesTest.java ,可以在命令行的任何目录下输入该命令,编译后,系统默认会在 D:sources 路径下生成 Test.class 文件

    -d   <目录>(使用该选项之前要先在计算机中建立目录)

    假设 D:sources 路径下有一个文件名为 Test.java 的文件。

    例如:javac   -d   E:myclasses   D:sourcesTest.java ,可以在命令行的任何目录下输入该命令,编译后,系统会在 E:myclasses 路径下生成 Test.class 文件 (注意:必须要先在计算机中建立 E:myclasses 路径)

    -sourcepath   <路径>

    例1(.java 文件在同一个包下):

    	
    // 假设该文件位于 E:comexample 路径下,文件名为 Fruits.java
    
    package com.example;
    
    public class Fruits{
    	@Override
    	public String toString(){
    		return "Fruits";
    	}
    }
    
    
    
    // 假设该文件位于 D:sources 路径下,文件名为 Test.java
    
    package com.example;
    
    public class Test{
    	public static void main(String[] args){
    		System.out.println(new Fruits()); // 引用 Fruits 对象
    	}
    }
    	
    

    程序:

    • 两个 .java 文件位于同一个包下(因为都是 package com.example)
    • Test 引用了 Fruits 对象

    编译 Test.java 文件的方法:(要先在计算机中建立 D:classes 路径)

    • 第一种方法:将命令行切换到 D:sources 目录下,然后执行 javac   -sourcepath   E:   -d   D:classes   Test.java
    • 第二种方法:在命令行的任意目录下,执行 javac   -sourcepath   E:   -d   D:classes   D:sourcesTest.java 命令
    • 第三种方法:向计算机环境变量 CLASSPATH 中添加 ;E: 然后在命令行的任意目录下执行 javac   -d   D:classes   D:sourcesTest.java

    运行 Test.class:

    • 将命令行切换到 D:classes 目录下,然后执行 java   com.example.Test

    例2(.java 文件在不同的包下):

    
    // 假设该文件位于 E:hzl
    etexample 路径下,文件名为 Person.java
    
    package net.example;
    
    public class Person{
    	@Override
    	public String toString(){
    		return "Person";
    	}
    }
    
    
    	
    // 假设该文件位于 D:sources 路径下,文件名为 Test.java
    
    package com.example;
    import net.example.Person; // 要导入包
    
    public class Test{
    	public static void main(String[] args){
    		System.out.println(new Person()); // 引用 Person 对象
    	}
    }
    
    

    程序:

    • 两个 .java 文件位于不同的包(package net.example; 和 package com.example;)
    • Test 引用了 Person 对象

    编译 Test.java 文件的方法:(首先要在计算机中建立 D:yourclasses 路径)

    • 第一种方法:将命令行切换到 D:sources 目录下,然后执行 javac   -sourcepath   E:hzl   -d   D:yourclasses   Test.java 命令(注意:如果我将 Person.java 中的包名改为 package hzl.net.example; 那么 Test.java 中的 import 应该改为 import hzl.net.example.Person; 要执行的编译命令应该为 javac   -sourcepath   E:   -d   D:yourclasses   Test.java)
    • 第二种方法:在命令行的任意目录下执行 javac   -sourcepath   E:hzl   -d   D:yourclasses   D:sourcesTest.java
    • 第三种方法:向计算机环境变量 CLASSPATH 中添加 ;E:hzl 然后在命令行任意目录下执行 javac   -d   D:yourclasses   D:sourcesTest.java

    运行 Test.class:

    • 将命令行切换到 D:yourclasses 目录下,然后执行 java com.example.Test

    例3(-sourcepath 的本质):

    执行包含该选项的命令时,系统会将指定的 <路径> 暂时覆盖掉 CLASSPATH 中的路径

    
    // 假设该文件位于 E:
    etexample 路径下,文件名为 Man.java
    
    package net.example;
    
    public class Man{
    	@Override
    	public String toString(){
    		return "Man";
    	}
    }
    
    
    	
    // 假设该文件位于 F:cnexample 路径下,文件名为 Woman.java
    
    package cn.example;
    
    public class Woman{
    	@Override
    	public String toString(){
    		return "Woman";
    	}
    }	
    
    
    	
    // 假设该文件位于 D:sources 路径下,文件名为 Test.java
    
    package com.example;
    import net.example.Man;
    import cn.example.Woman;
    
    public class Test{
    	public static void main(String[] args){
    		System.out.println(new Man()); // 引用 Man 对象
    		System.out.println(new Woman()); // 引用 Woman 对象
    	}
    }
    
    

    程序:

    • 有三个 .java 文件位于不同的包
    • Test 引用了 Man 和 Woman 对象

    1、还没配置 CLASSPATH 时:

    编译:(首先要在计算机中建立 D:myclasses 路径)

    • 在命令行的任何目录下执行 javac   -sourcepath   E:;F:   -d   D:myclasses   D:sourcesTest.java

    运行:

    • 将命令行切换到 D:myclasses 目录下,然后执行 java   com.example.Test

    2、CLASSPATH 的值配置为 .;E: (. 符号表示本地目录,E: 是存放 Man.java 文件的路径):

    编译:

    • 在命令行的任何目录下执行 javac   -sourcepath   F:   -d   D:myclasses   D:sourcesTest.java(编译不能通过,虽然说已经将 Man.java 的路径配置到了 CLASSPATH 中,但是程序还是找不到 Man.java ,这是因为在指定 -sourcepath 的 <路径> 时,该路径会暂时覆盖掉 CLASSPATH 中的值)

    3、想让编译通过:

    • 第一种方法:将 E: 和 F: 都配置到 CLASSPATH 中,即 CLASSPATH 的值为 .;E:;F: ,然后在命令行的任何目录下执行 javac   -d   D:myclasses   D:sourcesTest.java
    • 第二种方法:不管 CLASSPATH 的值是什么,直接在命令行的任何目录下执行 javac   -sourcepath   E:;F:   -d   D:myclasses   D:sourcesTest.java

    -classpath   <路径>

    同样,执行包含该选项的命令时,系统会将指定的 <路径> 暂时覆盖掉 CLASSPATH 中的路径

    -sourcepath 能实现的功能,-classpath 同样能实现, 但是 -classpath 能实现的功能,-sourcepath 不一定能实现,例如:

    很多时候,我们只有 .class 文件或者只有由 .class 文件组成的 jar 包,那么我们在编译程序的时候就不能用 -sourcepath 而是要用 -classpath 来指定路径,使程序能编译通过

    
    // 假设该文件位于 D:cnexample 路径下,文件名为 Animals.java
    // 假设我已经将它编译成 Animals.class 文件,并且将它放在 F:cnexample 路径下
    
    package cn.example;
    
    public class Animals{
    	@Override
    	public String toString(){
    		return "Animals";
    	}
    }
    
    
    
    // 假设该文件位于 D:sources 路径下,文件名为 Test.java
    
    package com.example;
    import cn.example.Animals; // 导入包
    
    public class Test{
    	public static void main(String[] args){
    		System.out.println(new Animals()); // 引用 Animals 对象
    	}
    }
    
    

    程序:

    • 假如我现在只有 Animals.class 文件,没有 Animals.java 文件(Animals.class 文件位于 F:cnexample 路径下)
    • Test 类引用了 Apple 对象

    编译 Test.java 文件的方法:(首先要在计算机中建立 D:myclasses 路径)

    • 在命令行的任何目录下运行 javac   -classpath   F:   -d   D:myclasses   D:sourcesTest.java(其中 -classpath 指定了 Apple.class 的路径)

    运行 Test.class:

    • 在命令行的任何目录下执行 java   -classpath   D:myclasses;E:   com.example.Test

    六、java 命令

    1. 格式:java   [options]   [class files]
    2. 常用的 options 有:
      • -classpath   <路径>
    3. 用法

    -classpath   <路径>

    例1:

    
    // 假设该文件位于 D:cnexample 路径下,文件名为 Animals.java
    // 假设我已经将它编译成 Animals.class 文件,并且将它放在 F:cnexample 路径下
    
    package cn.example;
    
    public class Animals{
    	@Override
    	public String toString(){
    		return "Animals";
    	}
    }
    
    
    
    // 假设该文件位于 D:sources 路径下,文件名为 Test.java
    
    package com.example;
    import cn.example.Animals; // 导入包
    
    public class Test{
    	public static void main(String[] args){
    		System.out.println(new Animals()); // 引用 Animals 对象
    	}
    }
    
    

    编译:

    • 在命令行的任何目录下执行 javac   -classpath   F:   -d   D:myclasses   D:sourcesTest.java

    运行:

    • 在命令行的任何目录下执行 java   -classpath   D:myclasses;F:   com.example.Test

    例2:

    执行包含该选项的命令时,系统也会将指定的 <路径> 暂时覆盖掉 CLASSPATH 中的路径

    
    // 假设该文件位于 D:sources 路径下,文件名为 Test.java
    
    package com.example;
    
    public class Test{
    	public static void main(String[] args){
    		System.out.println("Hello World !");
    	}
    }
    
    

    1、没有配置 CLASSPATH 的值时:

    编译:

    • 在命令行的任何目录下执行 javac   -d   D:myclasses   D:sourcesTest.java

    运行:

    • 将命令行切换到 D:myclasses 目录下,然后执行 java   -classpath   .   com.example.Test(-classpath 中的 <路径> 为 . 符号,表示指定了本地目录)

    2、将 CLASSPATH 的值配置成 . 符号

    编译:

    • 在命令行的任何目录下执行 javac   -d   D:myclasses   D:sourcesTest.java

    运行:

    • 将命令行切换到 D:myclasses 目录下,然后执行 java   -classpath   E:   com.example.Test(运行时会找不到 Test.class 文件,因为我将 -classpath 中的 <路径> 指定为 E: ,它会暂时覆盖掉 CLASSPATH 中的值)

    七、小结

    1)javac

    • -sourcepath 和 -classpath 都和 CLASSPATH 有关
    • 如果指定 -sourcepath 或者 -classpath ,那么他们的 <路径> 会暂时覆盖掉 CLASSPATH 中的值
    • 如果不指定 -sourcepath 或者 -classpath ,那么在编译程序时,系统会自动到 CLASSPATH 中寻找相应的路径

    2)java

    • -classpath 也和 CLASSPATH 有关
    • 如果指定 -classpath ,那么它的 <路径> 会暂时覆盖掉 CLASSPATH 中的值
    • 如果不指定 -classpath ,那么在运行程序时,系统会自动到 CLASSPATH 中寻找相应的路径

    3)程序编译和运行的步骤

    	
    // 假设该文件位于 E:
    etexample 路径下,文件名为 Person.java
    
    package net.example;
    
    public class Person{
    	@Override
    	public String toString(){
    		return "Person";
    	}
    }	
    
    
    	
    // 假设该文件位于 D:sources 路径下,文件名为 Test.java
    
    package com.example;
    import net.example.Person;
    
    public class Test{
    	public static void main(String[] args){
    		System.out.println(new Person()); // 引用 Person 对象
    	}
    }
    	
    

    编译:

    • 在命令行的任何目录下执行 javac   -sourcepath   E:   -d   D:myclasses   D:sourcesTest.java
    • 编译时,系统首先根据上面的命令找到 D:sources 目录下的 Test.java 文件,这是一个包含主类的 .java 文件
    • 然后根据 -sourcepath E: 和 Test.java 文件中的 import net.example.Person; 语句找到 E: etexample 路径下有 package net.example; 语句的 Person.java 文件(没有指定 -sourcepath 时,系统会去 CLASSPATH 中寻找,其实指定 -sourcepath 时,系统也是去 CLASSPATH 中寻找,因为 -sourcepath 的作用是暂时覆盖掉 CLASSPATH 的值)
    • 最后将编译好的 .class 文件存放在 D:myclasses 路径下
    • 整个过程:包含主类的 .java 文件 ——> CLASSPATH ——> import 语句 ——> 找到含有相应 package 语句的 .java 文件

    运行:

    • 在命令行的任何目录下执行 java   -classpath   D:myclasses   com.example.Test
    • 运行时,系统会根据 -classpath D:myclasses 和 com.example.Test 找到 D:myclassescomexample 路径下的 Test.class
    • 然后根据 -classpath D:myclasses 和 import net.example.Person; 语句找到 D:myclasses etexample 路径下有 package net.example; 语句的 Person.class

    八、生成 jar 包

    1)假设计算机中有一个 D:classes 路径,该路径下有 a.class ,b.class 和 c.class 三个文件
    2)将命令行切换到 D:classes 目录下,然后执行 jar   -cvf   Test.jar   *.class
    3)查看 D:classes 路径,会发现生成了一个 Test.jar 文件,这个文件中就包含了 a.class ,b.class 和 c.class 三个文件

    End~

  • 相关阅读:
    Bioinfomatics dataset
    在Vue中使用sass和less,并解决报错问题(this.getOptions is not a function)
    axios获取文件流并下载文件
    原码,反码,补码总结
    leetcode_sql
    Mysql中Limit用法三个简单事例
    idea新建maven项目没有target文件夹
    重启mysql
    Windows下载安装netcat(nc)命令
    启动hive
  • 原文地址:https://www.cnblogs.com/huangzenglie/p/8724919.html
Copyright © 2020-2023  润新知