1. 同一文件多个类:
class myname
{
public static void main(String[] args)
{
myage.showAge();
}
}
class myage
{
// 静态函数
public static void showAge()
{
System.out.println("age");
}
}
注:
①. 在同一个文件中,编译后会出现myname.class、myage.class.
②. 拆分成myname.java、myage.java文件,里面放入各自的类.编译后还是会出现上面两个文件.
③. 上面2种情况是,因为myname.class依赖于myage.class.
④. 但是myname.java如果不调用myage函数,编译只会产生一个文件:myname.class.
2. 拆分一个文件夹:
(1). test/my/myage.java:
// package my; // 包,没有就报错
class myage // 其它包引用,这里不加public,就会报错.
{
public static void showAge()
{
System.out.println("age");
}
}
(2). test/myname.java:
// import my.myname // 也可以写成import my.*引入这个包下所有的类
class myname
{
public static void main(String[] args)
{
myage.showAge(); // 不加import,可以写成my.myage.showAge();
}
}
注:
①. 编译会报错,因为不在同级目录下.
②. Java中的包(package):
a. 解决命名冲突
b. 项目组织结构可读性更好,是为了方便人阅读.
③. 引入包后,编译完后会出现test/myname.class、test/my/myage.class.
a. 混合编译在一起不好看,想要一个专门的文件来存放(一般IDE会自动做).
javac -d target me.java // -d可以把编译出来的class文件放到指定目录
b. 为了目录结构的美观,一般在src文件夹中放入源码.
src当前目录:javac -d ../target myname.java
不在src当前目录:javac -d target -sourcepath src src\myname.java
④. 运行程序:
a. 在d:/java/target目录下执行java myname => 可以正常运行
b. 在d:/java目录下执行java target/myname => 提示找不到或无法加载的主类target.myname.
3. classpath作用:
①. 设置path环境变量,在任何地方输入java或javac.
②. 显示classpath环境变量:
echo %CLASSPATH%
echo $CLASSPATH
.:/usr/local/jdk1.8.121/jdk1.8.0_121/lib/dt.jar // 这里有一个.
③. 上个例子,在java执行过程中,是通过CLASSPATH来寻找当前myname.class,不会随便在什么目录去寻找.因为有这个点(.),在当前目录是可以执行的,但是在其它目录是执行不了的.
③. 跨文件夹执行方案:
a. 把要执行的目录加入classpath环境变量 => 不现实
b. 在执行的时候加入-classpath:
java -classpath 绝对或相对路径 myname(要执行的class文件)