在cmd中运行 javac M.java 之后,文件夹中会生成 A.class 和 M.class 两个字节码文件,然后再运行 java M 就可以得到上面代码的输出结果 AAAA。这是在没包的前提下,这样运行没什么问题。但是有包之后就不能这样运行命令。
现在在前面添加了一句 package net.csdn; 语句之后,我们可以这样理解程序,在cmd中运行 javac M.java 之后,就像在文件的根目录再创建了两个子文件夹,类A也不再叫A,应该叫 net.csdn.A,M也不再叫M,应该叫net.csdn.M,如果再运行 java M就会出现错误。要使命令正确,正确运行,则我们需要建立包层,把 A.class 和 M.class 文件放进csdn文件夹中,再把csdn文件夹放入net文件夹中。在运行 java net.csdn.M就可以得到结果。
不同包类之间的访问的三种方式
在一个类中用另一个类创建对象时,应把这个类的包层也加到类前面用 import net.csdn.*,导入包层中所有的类用 import net.csdn.A,导入包层中的A类 在不同包之中加入 import net.csdn.*, 把net.csdn包中的所有类都导入进来 // A.java文件 package net.csdn; public class A { public void g() { System.out.printf("GGGG\n"); } protected void b() { System.out.printf("BBBB\n"); } } // B.java文件 package com.jxufe; import net.csdn.*; class B extends A { public void f() { // 在子类内部,可以使用继承过来的公有的和保护的成员 g(); // OK b(); // OK } } class M { public static void main(String[] args) { B bb = new B(); bb.f(); // => GGGG BBBB // 在子类外部通过类的对象只能访问父类的public成员 bb.g(); // => GGGG bb.b(); // error } }要把你要使用的jar的路径设置到 classpath 路径中去
假设现在有一个T.tar包,要想在任何目录下都可以访问T.tar包中的类,则设置classpath时,必须把包名T.jar也设置进去,因为T.jar也相当于一个目录如在d:\share\java下有一个T.tar,则classpath必须设置为d:\share\java\T.jar,不能设置为d:\share\java,也不能设置成d:\share\java\T,否则在非当前目录下是无法访问T.jar包中的类的