这道题一共要建三个目录:C:\myproj\bin、C:\myproj\lib和C:\myproj\classes,也可以自己建所要的目录,三个目录不同就可以了,具体要求如下:
n public的A.class和B.class属于包X.Y,该包存放在C:\myproj\classes中;public的C.class和D.class属于包S.T,把它们打包为E.jar文件中,并存放在C:\myproj\lib中;这些类均有四个方法:public void sayPublic()、private void sayPrivate()、protected void sayProtected()、void sayDefault(),而且都只包含一条语句System.out.println("Hi,"+this.getClass()+ "."+函数权限(public|private|protected|default))。
n Test1.class、Test2.class和Test3.class为测试类(带入口函数),存放在目录C:\myproj\bin下。
打包命令:jar cvf K.jar * (注意把子目录S/T也一起打包进去)。
引用jar文件的例子:
第一步、把.class文件放在子目录(com\group\food)中。
// Corn.java package com.group.food; public class Corn { public void eat(){ System.out.print("Eat corn"); } } // Rice.java package com.group.food; public class Rice { public void eat(){ System.out.println("Eat rice"); } } 第二步、执行命令"jar cvf food.jar *" 得到文件food.jar (内部包含了子目录信息) 第三步、 Set Classpath=c:\java\PackJar\food.jar 第四步、执行引用程序 // PackJar.java import com.group.food.*; public class PackJar{ public static void main(String[] args){ Rice rice = new Rice(); rice.eat(); Corn corn = new Corn(); corn.eat(); } } // Eat cookie // Eat bread Java程序如何找到并引用所需要的类? 1.利用环境变量CLASSPATH。 CLASSPATH中定义了很多根目录。 运行程序时Java解释器只从这些根目录开始查找一个Java程序 用到的类,即根目录和import指出的子目录 。例如,需要从当 前目录查找,则需要加入"."。 2.可以把包中的所有.class文件打包为一个jar文件,然后在 CLASSPATH中加入 该文件的路径。 3.可以在编译和运行时加入classpath参数指出所需要的包和根目 录: javac -classpath c:\java\PackJar\food.jar;c:\java;. PackJar.java java -classpath c:\java\PackJar\food.jar; c:\java;. PackJar 本次实验将先将四个class文件打包成一个包E.jar,放入目录lib下,在编译和运行时加入classpath参数:(1) Test1分别创建A和C的一个对象并调用这四个方法,看看哪些方法可以使用,不能使用的就注释掉。
import X.Y.*;//含A,B import S.T.*;//含C,D public class Test1 { public static void main(String[] args){ A a=new A(); //a.sayProtected(); //protected只能被导出类和同一个包的类所访问 a.sayPublic(); //a.sayPrivate(); //a.sayDefault(); //无修饰词 只能被同一个包的类所访问 C c=new C(); //c.sayProtected(); c.sayPublic(); //c.sayPrivate(); //c.sayDefault(); } } (2)Test2继承B并直接调用它的四个方法,看看哪些方法可以使用,不能使用的就注释掉。* 在main()中要采用“Test2 test2=new Test2(); test2.sayPublic();”进行调用,直接调用会出现 “无法从静态上下文中引用非静态方法”的错误。
import X.Y.*; import S.T.*; public class Test2 extends B{ public static void main(String[] args){ Test2 test2=new Test2(); test2.sayPublic(); //test2.sayPrivate(); //无修饰词 只能被同一个包的类所访问 test2.sayProtected(); //protected只能被导出类和同一个包的类所访问 //test2.sayDefault(); } }
(3)Test3继承D并直接调用它的四个方法,看看哪些方法可以使用,不能使用的就注释掉。(同上)
import X.Y.*; import S.T.*; public class Test3 extends D{ public static void main(String[] args){ Test3 test3=new Test3(); test3.sayPublic(); //test3.sayPrivate(); test3.sayProtected();//protected只能被导出类和同一个包的类所访问 //test3.sayDefault();//无修饰词 只能被同一个包的类所访问 } }