Java 笔记 —— java 和 javac
Java 笔记 —— java 和 javac
h2{
color: #4ABCDE;
}
a{
text-decoration: none !important;
}
a:hover{
color: red !important;
text-decoration: underline !important;
}
pre{
border: solid 1px #CCCCCC;
border-radius: 3px;
background-color: #F8F8F8;
overflow: auto;
white-space: pre;
font-size: 15px;
font-family: consolas, courier, monospace;
line-height: 20px;
padding: 6px 10px;
margin: 15px;
tab-size: 4;
}
p.textRight{
text-align: right;
}
span.bold1{
font-weight: bold;
}
span.color1{
color: red;
}
p.header{
font-size: 22px;
font-family: 楷体,arial,微软雅黑;
color: #787878;
font-weight: bold;
}
一、Java JDK 安装
1)JDK 在安装的过程中会出现两次安装提示,第 1 次是安装 JDK ,第 2 次是安装 JRE。我把 JDK 安装在 D:\Java\jdk\ 这个路径下,把 JRE 安装在 D:\Java\jre\ 这个路径下
2)在配置 PAHT 和 CLASSPATH 的值时,是对 JDK 安装路径的配置,与 JRE 安装路径无关(当然这只是一般情况下)
[ 返回顶部 ]
二、PATH
1) PATH 要配置的路径是:;D:\Java\jdk\bin;D:\Java\jdk\jre\bin(这里配置了两个路径,英文分号是每个路径的分隔符)。通常我们会增加一个变量 JAVA_HOME,它的值配置为:D:\Java\jdk(注意这里不用分号开头,也不用分号结尾),因此 PATH 的值通常配置为:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
2)添加 JAVA_HOME 变量的好处:当我重新安装 JDK 的时候,如果我想改变 JDK 的安装路径为 E:\Java\jdk\ ,当我没有配置 JAVA_HOME 时,我必须一个一个地去更改 PATH 的值,比如改为 ;E:\Java\jdk\bin;E:\Java\jre\bin ,但是如果我有配置 JAVA_HOME 的值,那我只需更改 JAVA_HOME 的值为 E:\Java\jdk 就行了,PATH 的值可以保持不变
3)配置 PATH 环境变量的作用:我们用命令行编译运行 Java 程序时,会经常用到 java 和 javac 这两个命令,当我们还没设定 PATH 的值的时候,这两个命令是没办法在命令行的任意文件目录下执行的,那么配置 PATH 值就是为了让这两个命令可以执行
4)java 和 javac 命令的工作原理:我们到 jdk 的安装路径下可以看到有一个 bin 文件夹,进入 bin 文件夹里面会发现 java 和 javac 就在这里。java 和 javac 都是 .exe 程序,在命令行中如果想要执行 .exe 程序,那么必须要从命令行进入到放置 .exe 程序的目录下,我们可以在命令行中输入 cd /d D:\Java\jdk\bin 命令,然后命令行会进入 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\tools.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\tools.jar ,现在我将编译好的 Test.class 文件放在 D:\ExampleClass\ 路径下,那么我想要在命令行中执行 java Test 命令要怎么办呢?有两种方法,第一种方法:我将命令行切换到 D:\ExampleClass\ 目录下,然后可以直接执行 java Test 命令(因为 CLASSPATH 配置了 . 符号,能在本地目录下寻找 Test.class 文件)。第二种方法:将 D:\ExampleClass\ 路径添加到 CLASSPATH 中,即 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.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:\Example\Test.java 在命令行的任何目录下执行
[ 返回顶部 ]
五、javac 命令
- 格式:javac [options] [source files]
- 常用的 options 有:
- -d <目录> ,该选项用于编译时将 .class 和 .java 文件分开存放
- -sourcepath <路径> ,该选项用于编译时指定 .java 文件的位置
- -classpath <路径> ,该选项用于编译时指定 .class 文件的位置
- 用法
无 options
假设 D:\sources\ 路径下有一个文件名为 Test.java 的文件。
例如:javac D:\sources\Test.java ,可以在命令行的任何目录下输入该命令,编译后,系统默认会在 D:\sources\ 路径下生成 Test.class 文件
-d <目录>(使用该选项之前要先在计算机中建立目录)
假设 D:\sources\ 路径下有一个文件名为 Test.java 的文件。
例如:javac -d E:\myclasses D:\sources\Test.java ,可以在命令行的任何目录下输入该命令,编译后,系统会在 E:\myclasses\ 路径下生成 Test.class 文件 (注意:必须要先在计算机中建立 E:\myclasses\ 路径)
-sourcepath <路径>
例1(.java 文件在同一个包下):
// 假设该文件位于 E:\com\example\ 路径下,文件名为 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:\sources\Test.java 命令
- 第三种方法:向计算机环境变量 CLASSPATH 中添加 ;E:\ 然后在命令行的任意目录下执行 javac -d D:\classes D:\sources\Test.java
运行 Test.class:
- 将命令行切换到 D:\classes\ 目录下,然后执行 java com.example.Test
例2(.java 文件在不同的包下):
// 假设该文件位于 E:\hzl\net\example\ 路径下,文件名为 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:\sources\Test.java
- 第三种方法:向计算机环境变量 CLASSPATH 中添加 ;E:\hzl 然后在命令行任意目录下执行 javac -d D:\yourclasses D:\sources\Test.java
运行 Test.class:
- 将命令行切换到 D:\yourclasses\ 目录下,然后执行 java com.example.Test
例3(-sourcepath 的本质):
执行包含该选项的命令时,系统会将指定的 暂时覆盖掉 CLASSPATH 中的路径
// 假设该文件位于 E:\net\example\ 路径下,文件名为 Man.java package net.example; public class Man{
@Override
public String toString(){
return "Man";
}
}
// 假设该文件位于 F:\cn\example\ 路径下,文件名为 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:\sources\Test.java
运行:
- 将命令行切换到 D:\myclasses\ 目录下,然后执行 java com.example.Test
2、CLASSPATH 的值配置为 .;E:\ (. 符号表示本地目录,E:\ 是存放 Man.java 文件的路径):
编译:
- 在命令行的任何目录下执行 javac -sourcepath F:\ -d D:\myclasses D:\sources\Test.java(编译不能通过,虽然说已经将 Man.java 的路径配置到了 CLASSPATH 中,但是程序还是找不到 Man.java ,这是因为在指定 -sourcepath 的 <路径> 时,该路径会暂时覆盖掉 CLASSPATH 中的值)
3、想让编译通过:
- 第一种方法:将 E:\ 和 F:\ 都配置到 CLASSPATH 中,即 CLASSPATH 的值为 .;E:\;F:\ ,然后在命令行的任何目录下执行 javac -d D:\myclasses D:\sources\Test.java
- 第二种方法:不管 CLASSPATH 的值是什么,直接在命令行的任何目录下执行 javac -sourcepath E:\;F:\ -d D:\myclasses D:\sources\Test.java
-classpath <路径>
同样,执行包含该选项的命令时,系统会将指定的 暂时覆盖掉 CLASSPATH 中的路径
-sourcepath 能实现的功能,-classpath 同样能实现, 但是 -classpath 能实现的功能,-sourcepath 不一定能实现,例如:
很多时候,我们只有 .class 文件或者只有由 .class 文件组成的 jar 包,那么我们在编译程序的时候就不能用 -sourcepath 而是要用 -classpath 来指定路径,使程序能编译通过
// 假设该文件位于 D:\cn\example\ 路径下,文件名为 Animals.java
// 假设我已经将它编译成 Animals.class 文件,并且将它放在 F:\cn\example\ 路径下 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:\cn\example\ 路径下)
- Test 类引用了 Apple 对象
编译 Test.java 文件的方法:(首先要在计算机中建立 D:\myclasses\ 路径)
- 在命令行的任何目录下运行 javac -classpath F:\ -d D:\myclasses D:\sources\Test.java(其中 -classpath 指定了 Apple.class 的路径)
运行 Test.class:
- 在命令行的任何目录下执行 java -classpath D:\myclasses;E:\ com.example.Test
[ 返回顶部 ]
六、java 命令
- 格式:java [options] [class files]
- 常用的 options 有:
- -classpath <路径>
- 用法
-classpath <路径>
例1:
// 假设该文件位于 D:\cn\example\ 路径下,文件名为 Animals.java
// 假设我已经将它编译成 Animals.class 文件,并且将它放在 F:\cn\example\ 路径下 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:\sources\Test.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:\sources\Test.java
运行:
- 将命令行切换到 D:\myclasses\ 目录下,然后执行 java -classpath . com.example.Test(-classpath 中的 <路径> 为 . 符号,表示指定了本地目录)
2、将 CLASSPATH 的值配置成 . 符号
编译:
- 在命令行的任何目录下执行 javac -d D:\myclasses D:\sources\Test.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:\net\example\ 路径下,文件名为 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:\sources\Test.java
- 编译时,系统首先根据上面的命令找到 D:\sources\ 目录下的 Test.java 文件,这是一个包含主类的 .java 文件
- 然后根据 -sourcepath E:\ 和 Test.java 文件中的 import net.example.Person; 语句找到 E:\net\example\ 路径下有 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:\myclasses\com\example\ 路径下的 Test.class
- 然后根据 -classpath D:\myclasses 和 import net.example.Person; 语句找到 D:\myclasses\net\example\ 路径下有 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~
Java 笔记 —— java 和 javac的更多相关文章
- java笔记——java加载与执行
java的加载与执行过程: 编译阶段: 首先,我们先创建一个java源文件xxx.java 2. 经过javac.exe编译(如果源文件没有语法错误),生成一个或多个.class文件,注意的是此时的字 ...
- java笔记——Java关键字static、final使用小结
static 1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...
- Java笔记--java一行一行写入或读取数据
转自 Ruthless java一行一行写入或读取数据 链接:http://www.cnblogs.com/linjiqin/archive/2011/03/23/1992250.html 假如E:/ ...
- Java笔记--Java的List、Iterator用法
1. List的使用 准备知识: List继承自Collection接口.List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作. 跟Set ...
- java笔记 -- java字符串
概念: Java字符串就是Unicode字符序列, Java没有内置的字符串类型, 而是在标准Java类库中提供了一个预定义类. 每个用双引号括起来的字符串都是String类的一个实例.String ...
- java笔记 -- java变量与常量的声明
变量: 在Java中, 每一个变量属于一种类型. double salary int vacationDays; long earthPopulation; boolean done; 命名: 以字母 ...
- java笔记 -- java数据类型与类型转换
Java是一种强类型语言, 这就意味着必须为每一个变量声明一种类型. Java中一共有8中基本类型: 4种整型: 整型: 用于表示没有小数部分的数值, 允许为负数 类型 存储需求 取值范围 int: ...
- java笔记 -- java简单结构代码解析及注释
结构代码解析 public class FirstSample { public static void main(String[] args) { System.out.println(2.0-1. ...
- Think in Java笔记——Java与对象
最近在重新学习Java,在阅读Java的经典著作——Java编程思想,因此每天记录阅读的心得. 当听到Java这个词时,大家一般想到的是面向对象,确实Java相对于C/C++这两门语言来说,Java最 ...
随机推荐
- 谁能赢呢? BZOJ 2463
题目描述 小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问 ...
- 洛谷 P1028 数的计算
嗯... 首先这道题想到的就是递推.... 但是递推失败 (不知道自己是怎么想的 然后又想打一个暴力,但是数的最高位太难存储了,所以又放弃了(并且好像这个暴力大约500就会炸... 然后看了题解,才发 ...
- HDU-Big Number (斯特林公式)
In many applications very large integers numbers are required. Some of these applications are using ...
- Go语言构建json和解析json实例
参考网址如下: https://www.cnblogs.com/fengbohello/p/4665883.html
- Go语言基础之2--字符串详解
一.字符串原理解析 1. 字符串底层就是一个byte数组,所以可以和[]byte类型互相转换:(字符串可以存文本,也可以存二进制,因为其本来就是一个字节流) 2. 字符串之中的字符是不能修改的,那怎 ...
- python3 enumerate()函数笔记
d={"A":"a","B":"b","C":"c","D" ...
- java多线程-创建线程
大纲: Thread创建线程. Runnable接口. Callable接口. 小结 一.java创建线程--继承Thead类 创建一个类继承Thead类,并重写run方法. class Test { ...
- oracle impdp时卡死Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
今天在用impdp导入时,Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX卡在建索引的过程一直不动,也不报错,重试了好几遍还是这样. 后来恍 ...
- Robotframework测试相关库
一. 官网地址 http://robotframework.org/#libraries 二.几类测试所用到的常用库初步整理 1. UI自动化测试 Selenium2Library.BuiltIn(自 ...
- (转)cut命令详解
Linux:cut命令详解 cut 文件内容查看 显示行中的指定部分,删除文件中指定字段 显示文件的内容,类似于下的type命令. 说明 该命令有两项功能,其一是用来显示文件的内容,它依次读取由参 ...