Java学习 -- 包

没有包的情况

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.classM.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();
	}
}
  1. package语句必须得是第一条语句
  2. package net.csdn表示:把改文件中所有的类放入net.csdn这个包中,并且改文件中所有的类真正名字将是包名和类名的组合
  3. 如:类TestPackage的名字将变成 net.csdn.TestPackage,而不再是TestPackage
  4. 编译时建议使用javac -d . TestPackage.java 尽量不要使用 javac TestPackage.java 因为后者要自己手动建立包目录
  5. 如果不在当前路径下运行程序,则必须保证class文件的最上层目录的父目录位于classpath下
  6. 注意:javac -d . A.java 其中 -d 表示自动生成包层 . 表示这个包层是在当前目录下建立

java net.csdn.TestPackage解析

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

不同包类之间的访问

在这里插入图片描述
在这里插入图片描述
不同包类之间的访问的三种方式

  1. 在一个类中用另一个类创建对象时,应把这个类的包层也加到类前面
  2. import net.csdn.*,导入包层中所有的类
  3. 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包的生成

  1. 先编译源文件 javac -d . M.java,生成字节码文件
  2. 然后新建一个文件夹,把刚才编译的文件夹放进去
  3. 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文件的主要作用:
    1. 发布和使用类库
    2. 便于资源的组合和管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值