Java学习 --包

    xiaoxiao2025-02-12  15

    没有包的情况

    class A { public void f() { System.out.printf("AAAA\n"); } } class M { public static void main(String[] args) { // A aa = new A(); // aa.f(); new A().f(); } }

    在cmd中运行 javac M.java 之后,文件夹中会生成 A.class 和 M.class 两个字节码文件,然后再运行 java M 就可以得到上面代码的输出结果 AAAA。这是在没包的前提下,这样运行没什么问题。但是有包之后就不能这样运行命令。

    有包的情况

    package net.csdn; class A { public void f() { System.out.printf("AAAA\n"); } } class M { public static void main(String[] args) { // A aa = new A(); // aa.f(); new A().f(); } }

    现在在前面添加了一句 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就可以得到结果。

    package的使用

    // 文件名“TestPackage.java” package package net.csdn; class A { public void f() { System.out.printf("AAAA\n"); } } public class TestPackage { public static void main(String[] args) { new A().f(); } } package语句必须得是第一条语句package net.csdn表示:把改文件中所有的类放入net.csdn这个包中,并且改文件中所有的类真正名字将是包名和类名的组合如:类TestPackage的名字将变成 net.csdn.TestPackage,而不再是TestPackage编译时建议使用javac -d . TestPackage.java 尽量不要使用 javac TestPackage.java 因为后者要自己手动建立包目录如果不在当前路径下运行程序,则必须保证class文件的最上层目录的父目录位于classpath下注意:javac -d . A.java 其中 -d 表示自动生成包层 . 表示这个包层是在当前目录下建立

    java net.csdn.TestPackage解析

    先检测当前目录下是否有 net/csdn这个包(包即文件夹),如果有,再检测该包下是否有 net.csdn.TestPackage这个类,如果没有,编译器将再去classpath设置的路径中依次查找。如果都查找失败,则运行时出错。

    不同包类之间的访问

    不同包类之间的访问的三种方式

    在一个类中用另一个类创建对象时,应把这个类的包层也加到类前面用 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 } }

    不同访问修饰符(重点)

    在同一个包中只要私有的不能被另一个类访问,也只有私有的不能被继承在不同包没有任何关系的两个类,只有public类的public成员才可以被另一个包中的类访问在不同包中有继承关系的两个类,只有public类的public成员和public类的protected成员可以被另一个包中的子类在内部使用,但是在子类的外部,通过子类对象名只能访问父类的public成员

    jar包的生成

    先编译源文件 javac -d . M.java,生成字节码文件然后新建一个文件夹,把刚才编译的文件夹放进去cmd进入刚新建的目录,使用命令 jar cvf M.jar * ,生成jar文件。
    怎么使用jar包中的类

    要把你要使用的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包中的类的

    归档管理jar

    Java归档工具是JDK中提供的一种多用途的存档及压缩工具,可以将多个文件或目录合并压缩为单个的Java归档文件jar文件的主要作用: 发布和使用类库便于资源的组合和管理
    最新回复(0)