一、总结

1.引入包的概念的原因和包的作用
比如有多个人开发一个大型程序,A定义了一个Math.java类,B也定义了一个Math.java类,它们放在不同目录,使用的时候也是用目录来区分,
包实际上就是一个文件夹(可以含有多级子目录)路径名。包的作用就是用来区分同名的类(冲突问题)。

2.使用步骤
package:
Java源文件中:package 包名.子包名;eg: package a.b.c.d;
编译命令:javac -d <dir> <file.java> 表示在<dir>目录下生成包
执行方法:java 包名.子包名.类名

import:
使用不同的包时要import
public class可以被外包访问,class只能在本包中访问 ###???###
格式:java文件中 import 包名.子包名.类名; 这是手工导入这个类,也可以 import 包名.子包名.*;让JVM自动加载需要的类。

jar:
生成:jar -cvf <file.jar> <dir>
查看:jar -tvf <file.dir>
解压:tar -xvf <file.dir>

3.包就是一个文件夹路径,所以也可以在包下创建类

4.把程序交给用户的时候需要把Pack.class和整个包(a目录)交给他,这样比较麻烦,可以使用jar打包一下. jar -help 查看帮助。

5.压缩成.jar文件后删除a目录后java Pack运行报错“NoClassDefFoundError”,用户找不到这个类了,我们需要设置一个环境变量CLASSPATH,
它有两个作用,一个是在编译的时候来查找源代码,另一个作用是在执行时查找类的路径。
$ export CLASSPATH=.:my.jar //使用‘:’控制若在当前目录下找不到就去my.jar下面找
然后删除包目录再编译javac Pack.java就可以成功了,执行javac Pack也是成功的。

此时$export CLASSPATH=.将其设置为默认值,然后重新执行java Pack时就又报错了,说明是实时更加CLASS_PATH的值查询的。

如果以后遇到报找不到类的时候就可以考虑是否要设置CLASSPATH。它可以指定目录,也可以指定压缩包。

6.javac -help指明使用-verbose可以在编译时输出更多信息,加上它后可以看它去哪里查找那些源代码[search path for source files: .,my.jar]。
显示出的那些目录就是通过CLASS_PATH指定的。
$ javac Pack.java -verbose

二、例子

1. 编译生成包

/*file: Pack.java*/

package a.b.c.d; //要把编译生成的class文件放在指定目录下的a/b/c/d/目录下

public class Pack {
public static void main(String args[]) {
System.out.println("Hello, world!");
}
} /*
编译执行:
$ javac -d . Pack.java
$ java a.b.c.d.Pack
*/

2.区分使用不同包中的函数

$ tree
.
├── lisi
│ └── Math.java
├── Pack.java
└── zhangsan
├── Math.java
└── Print.java

zhangsan/Math.java

package a.b.c.d2;

public class Math {
public static int sub(int x, int y) {
return x - y;
} public static int add(int x, int y) {
return x + y + 2;
} }

zhangsan/Print.java

package a.b.c.d2;

public class Print {
public static void printInfo() {
System.out.println("package: a.b.c.d2");
} }

lisi/Math.java

package a.b.c.d1;

public class Math {
public static int add(int x, int y) {
return x + y;
}
}

Pack.java

import a.b.c.d1.*; //a.b.c.d1.Math
import a.b.c.d2.*; //若这里都直接写a.b.c.d2.Math会报错:Math already defined in a single-type import public class Pack {
public static void main(String args[]) {
/* add */
System.out.println(a.b.c.d1.Math.add(1,2)); //调用指定包的函数
System.out.println(a.b.c.d2.Math.add(1,2)); /* sub */
System.out.println(a.b.c.d2.Math.sub(1,2)); a.b.c.d2.Print.printInfo(); //调用包下面的Print类的printInfo方法
Print.printInfo(); //也可以这样调用,如果没有同名的类的话就不需要使用包来限制它
}
}

编译执行

javac -d . lisi/Math.java
javac -d . zhangsan/Math.java
javac -d . zhangsan/Print.java javac Pack.java
javac Pack

打包的例子略。

2.第二个例子

/*A.java*/
package a.b.c; public class A {
public int count; protected void print_a() {
System.out.println("print_a");
}
}
/*B.java*/
package d.e.f; /*package必须要在import前面*/
import a.b.c.A; public class B extends A {
public int count; public void print_b() {
super.print_a(); /*处于不同的包中子类也可以访问父类的protected成员*/
System.out.println("print_b");
}
}
/*Test.java*/
package m.n; import a.b.c.A;
import d.e.f.B; public class Test {
public static void main(String args[]) {
B b = new B();
b.print_b();
}
}
/*编译步骤*/
export export CLASSPATH=./
javac -d ./ A.java
javac -d ./ B.java
javac -d ./ Test.java $ tree
.
├── a
│ └── b
│ └── c
│ └── A.class
├── A.java
├── B.java
├── d
│ └── e
│ └── f
│ └── B.class
├── m
│ └── n
│ └── Test.class
└── Test.java /*运行和结果*/
$ java m.n.Test
print_a
print_b

Java中的包学习笔记的更多相关文章

  1. 关于高淇JAVA中SORM总结学习笔记详细个人解释

    代码来源于高淇JAVA教学视频 谢谢高淇老师的教学. 因为自己在学习的过程中发现了很多困难点,总结下希望对自己接下来学框架提升.给像我一样得初学者方便. SORM框架是一个简单的ORM,关系对象映射, ...

  2. Java中的权限学习笔记

    1.Java中的权限有两个层次,一个是类这一层,另一个是类成员那一层. 类这一层: public class可以在本包内被访问,也可以在包外被访问.而没有被public修饰的class只能在本包内被调 ...

  3. java学习——java中的反射学习笔记

    Java--reflect 一.Class类的使用 什么是Class类? 1:在面向对象的世界中,万事万物皆对象. java语言中,静态的成员,普通数据类型类是不是对象呢? 是,对象!是类的对象! 类 ...

  4. java.util.concurrent包学习笔记(一)Executor框架

    类图: 其实从类图我们能发现concurrent包(除去java.util.concurrent.atomic 和 java.util.concurrent.locks)中的内容并没有特别多,大概分为 ...

  5. 《Java并发编程的艺术》第5章 Java中的锁 ——学习笔记

    参考https://www.cnblogs.com/lilinzhiyu/p/8125195.html 5.1 Lock接口 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同 ...

  6. java中String类学习笔记

    1.String的两种实例化方式 String str="hello";//直接赋值的方式: String str=new String("hello");// ...

  7. Java后端高频知识点学习笔记1---Java基础

    Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...

  8. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  9. java 中的包概念

    Java 中的包package, 就是电脑中的文件夹.我们平时在工作中,文件太多时,都会新建文件夹进行分类管理,java 中的包也是类似的道理,当我们的类太多时,也需要进行分类管理,这时我们就会把类文 ...

随机推荐

  1. Java并发编程_wait/notify和CountDownLatch的比较(三)

     1.wait/notify方法 package sync; import java.util.ArrayList; import java.util.List; public class WaitA ...

  2. c语言中printf("%x",-1);为什么会输出-1的十六进制补码??

    计算机存储的时候是以补码的形式存进去的,输出来在以你原码的形式输出(这个形式就是你设置的形式)! 比如: -1 (32位模式) 存: 1 000000000000000000000000000000 ...

  3. idea查看jar包是否存在

    idea在project目录下如下图(1),是总的pom文件,定义了四个子模块共用的依赖,并且其中定义了四个子模块,,每个模块都有各自的pom.xml文件.结构目录只有一个总的lib库. 但是可能在s ...

  4. 深入理解java虚拟机---对象的创建过程(八)

    1.对象的创建过程 由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程. 注意: 最后一步的init方法是代码块和构造方法. 以上是总图,下 ...

  5. MFC Release版本串口连不上的问题

    项目开发过程中发现Release版本存在连接串口时,第一次开机后,出现连接不上的问题,但在Debug版本下正常:而且只要连接上一次,Release版本就能正常连接: 解决方案: 在串口配置过程中更改为 ...

  6. 二、求水仙花数,打印出100-999之间所有的"水仙花数"

    所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方 public c ...

  7. easyui再学习的一部分代码

    <%-- Created by IntelliJ IDEA. User: zhen Date: // Time: : To change this template use File | Set ...

  8. Delphi直接实现分享图片功能

    procedure TCustomCameraViewDoc.ShareTextClick(Sender: TObject); var FSharingService: IFMXShareSheetA ...

  9. 2019-03-22-day017-re模块

    讲在课前 严格的执行每天的内容 学习的方法 记笔记 课上记框架 画思维导图 常用模块 30分钟 复习 翻笔记 2h 把课上的例子跟着都敲一遍 遇到不会的 自己研究5分钟 还不会 问问同学 再不会 问问 ...

  10. 构造方法调用另一个构造方法,用this

    using System; class Person { public int age; public string name; public Person(int age, string name) ...