java编译的语句_Java含package语句下的编译运行

学习java已经有一段时间,但是之前对java中包这个概念理解的不是很透彻,也没有花时间详细学习包,所以今天抽出时间来仔细地研究下java中的包。

之前我所理解的包就是一个路径,但其实不然。windows下面的路径应该包含盘符和具体的目录,比如:E:\filetest\src\source就是一个合法的路径,但是包可以是路径中一部分目录的层次关系,比如:package scr.source中,src.source就是一个包名。大致理解了什么是包之后,我们再来看看有包名和无包名情况下,如何进行程序的编译和运行。

首先看看无package下的编译运行。

我把 packageDemo01.java保存在 D:\下面,具体的测试代码如下:

public class packageDemo01{

public static void main(String[] args){

System.out.println("hello java");

}

}最常规的编译运行手段,首先进入源文件目录,再在目录下面 javac packageDemo01.java,这时候 .java 和 .class 文件在同一个目录下面。

利用指定文件路径名的方式编译源文件。相较于1只是少了进入源文件目录这个步骤。

使用参数 -d 来指定生成的 .class 文件所在的目录。前面的两个例子中,默认情况下 .class 文件和 .java 文件是在同一个目录下面的。我们来看看参数 -d 的效果。我把生成的 .class 文件指定到 e:\filetest 目录下面,下一步运行程序时我们必须进入这个目录下面,然后再 java packageDemo01。

使用参数的同时使用指定文件路径名。这种方式其实和第三种差不多,只是少了进入源文件目录进行编译的步骤。

然后再来谈谈有 package 情况下的编译运行。

这中情况下,我把源文件保存在了 e:\filetest\src\source 目录下面,之所以用这么深的目录,主要是为了后面解释包更加方便。测试代码如下:

package filetest.src.source;

public class packageDemo02{

public static void main(String[] args){

System.out.println("hello java 02");

}

}

在第一行中加入了一段包语句。在声明了包的程序中,就没有必要指定将生成的 .class 文件存放到哪个目录下面,这里只讨论 .java 和 .class 文件在同一个目录下面的情况。

编译源程序。和前面讨论的情况一样,我们有两种选择方式。进入源文件目录下面编译

这种情况下,我们运行源程序时,就不能再源程序那个目录下面 java packageDemo02,会报错:“无法加载主类”,因为源程序中使用了 package。这时候,需要进入包路径中的上一个目录,这里就是 e:\下面进行运行。但是还有一点需要注意:这时候类名是需要和包名一起写的,也就是 filetest.src.source.packageDemo02。

2. 利用路径名编译。和之前的一样,不在赘述。

大伙再看,当我把包名修改一下时,变成这样:

package src.source;

public class packageDemo02{

public static void main(String[] args){

System.out.println("hello java 02");

}

}

这时候的编译运行就应该是下图这样了:

到这里我们基本上对java中的包讨论的差不多了。下面再来讨论下与 package 相对应的 import语句。

假如我现在有一个源文件和上面的 packageDemo02.java 不在同一个包下面,但是又需要使用类 packageDemo02 里面的某些方法,这时候就需要 import。

import filetest.src.source.packageDemo02;

平时我们为了写程序方便,习惯使用类似于这种代码:

import java.awt.*;

import java.net.*;

如果程序较小时可以接受,但是当代码量很大时就不能这么写了。因为当我们需要引入A包中的某个类时,这个类名正好和B包中的某个类同名,当我们用这个类来实例化对象,java虚拟机就不能确定这个类到底是A包中的类,还是B包中的类,就会报错。所以,当代码量很大时,就需要明确的指出引入包中的哪个类,而不是用 * 统一引入。

上面讲的差不多是一般情况下包的引入,下面我们来看看静态导入包。

一般情况下,我们引入某个类,就可以使用 类名.方法名 来调用类中的静态方法。但是当程序中需要多次使用这个方法时,重复的使用 类名.方法名 会使代码看起来很臃肿。比如这样:

import java.lang.Math;

public class Point2D {

int x, y;

//如果类中有含有参数的构造方法,那么一定要声明一个无参数的构造方法,//因为在子类中构造方法默认会调用父类的无参构造方法public Point2D(){};

public Point2D(int x, int y){

this.x = x;

this.y = y;

}

//实现坐标的平移,向右平移a 向上平移bpublic void offset(int a, int b){

x = x + a;

y = y + b;

}

public double getDistance2D(Point2D p1, Point2D p2){

double distance =

Math.sqrt(Math.pow((p1.x - p2.x), 2) + Math.pow((p1.y - p2.y), 2));

return distance;

}

}

我们就得反复使用 Math.pow()方法,如果我们修改 import 语句,就可以直接使用 pow() 方法:

import static java.lang.Math;

public class Point2D {

int x, y;

//如果类中有含有参数的构造方法,那么一定要声明一个无参数的构造方法,//因为在子类中构造方法默认会调用父类的无参构造方法public Point2D(){};

public Point2D(int x, int y){

this.x = x;

this.y = y;

}

//实现坐标的平移,向右平移a 向上平移bpublic void offset(int a, int b){

x = x + a;

y = y + b;

}

public double getDistance2D(Point2D p1, Point2D p2){

double distance =

sqrt(pow((p1.x - p2.x), 2) + pow((p1.y - p2.y), 2));

return distance;

}

}

使用 import static 的话,就是只导入原来类中的所有静态方法和静态变量。这样写代码的时候会轻松方便一点。

说到 import关键字,我们就有必要再来细谈一下 classpath环境变量了。

首先:对于设置系统环境变量 Path,这个很好理解,就是我们需要将JDK子目录lib目录下面的一些命令,比如 java javac javadoc等等,将这些命令的目录添加到Path中,这样我们就可以在windows系统中的任何目录下面,直接使用这些命令,而不需要每次都要进入这些命令的安装目录下面。

但是我相信很多 java 初学者和我一样,一直对 java 中 classpath 这个环境变量理解不透。我们会发现,只要我们设置了Path,即使没有设置classpath,程序同样能跑起来,这是为什么呢?难道classpath不用设置吗?

实际上:如果使用JDK1.5以上版本的JDK,完全可以不用设置classpath环境变量,因为这些工作java开发者在开发过程中已经帮我们做好了。但是如果是JDK1.5之前版本的JDK,我们就会遇到下面的问题。

从前面编译运行程序的过程中,我们可以看到,不管什么方式,每次我们运行java程序时,都必须进入编译生成的字节码 .class 所在的目录,或者是包名的上一层目录,然后才能用 java 命令运行程序。实际上,当我们用java命令时,JRE会去搜索我们用javac命令生成的 .class 文件,JRE会默认首先在当前目录下面搜索,这也就是为什么我们每次都必须在 .class 文件目录下面java的原因了。而这些都是JDK1.5之后JVM自动帮我们实现的,也就是自动帮我们设置好了classpath的值,告诉JVM去哪寻找这些 .class 文件。但是在JDK1.5之前,我们按照上面的做法会提示报错:无法加载主类。这时候就需要设置classpath值了。

classpath的值是一系列路径的值。这里,我们需要将与编译运行相关的类,在JDK\jre\lib\rt.jar 目录下面,添加到classpath中;同时还要包括一点(.),这个点告诉JVM首先在当前目录下面搜索 .class 文件。设置完差不多就是这样(注意我两个路径中用的是分号隔开)。这样的话,每次运行程序时,JVM就会首先在当前目录下面搜索 .class 文件,然后再去 D:\jdk7\jre\lib\rt.jar 目录下搜索,如果找不到相关的类,就会报错:无法加载主类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 源根之外的Java文件无法编译是因为在Java编译的过程中,编译器只会处理指定的源文件,而源文件的范围通常限定在源根目录下。源根目录是指项目的根目录下的指定文件夹,通常被称为"src"文件夹。 编译器需要根据源文件之间的依赖关系来逐个编译源文件,根据需要生成对应的字节码文件。如果某个Java文件位于源根目录之外的位置,编译器就无法找到并处理它,因此无法将其编译为字节码文件。 需要注意的是,虽然源根之外的Java文件无法直接编译,但是可以作为外部库文件导入到源码中,并在源码中进行调用。通过使用import关键字引入外部库文件,可以在源文件中使用外部库提供的类和方法。 总之,源根之外的Java文件无法直接进行编译,但可以通过导入外部库的方式在源文件中使用。编译器只会处理源根目录下的Java文件,并根据依赖关系逐个编译生成对应的字节码文件。 ### 回答2: 在Java中,源根(source root)是指项目中存放源代码的根目录。在这个目录之外的Java文件无法被编译Java编译器在编译Java文件时,会按照一定的规则去查找和编译源代码文件。默认情况下,编译器只会编译源根目录下的Java文件,并会将编译生成的.class文件保存在对应的目录中。 如果Java文件不在源根目录下,编译器将无法找到这些文件并进行编译。这是因为编译器依赖于文件的路径来确定要编译的文件。 对于不在源根目录下的Java文件,我们可以通过修改编译器的参数来指定它们所在的位置。可以使用命令行工具或者构建工具(如Maven或Gradle)来配置编译路径,使编译器能够找到并编译这些Java文件。 值得注意的是,虽然源根之外的Java文件无法直接编译,但是它们可以作为依赖文件被编译器引用。在一些特殊的情况下,我们可能需要将源码文件放在源根之外,以便供其他文件引用。 总之,源根之外的Java文件无法直接编译,但可以通过配置编译路径来让编译器找到并进行编译。 ### 回答3: 源根之外的Java文件无法编译是因为Java编译器只会编译源根目录下面的Java文件。源根目录是指项目中java源代码文件的根目录,通常是一个文件夹。这个根目录下可以有多个包(package),每个包下又可以有多个Java文件。 Java编译编译Java文件时,会按照包的结构将编译后的类文件(.class文件)保存在对应的包目录中。因此,如果一个Java文件不在源根目录中或者有一个新的包需要编译,需要将该文件移动到源根目录下或者在源根目录下建立一个对应的包目录。 另外,源根之外的Java文件也无法被其他Java文件引用。在Java中,要使用一个类或者接口,需要先在代码中import这个类或者接口,然后才能使用它们提供的方法和属性。而import语句只会搜索源根目录及其子目录下的包,因此源根之外的Java文件是无法被正确引用的。 综上所述,源根之外的Java文件无法编译是因为编译器只会编译源根目录下的Java文件,也无法被其他Java文件引用。为了解决这个问题,我们可以将源根之外的Java文件移动到源根目录下,或者在源根目录下建立对应的包目录,并将文件放入该目录中。这样就可以正常进行编译和引用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值