共计 2057 个字符,预计需要花费 6 分钟才能阅读完成。
1.Packages
在 Java 中,Packages 是治理 class 和 interface 的命名空间(namespace),包名与网站名正好相同,比方:
ug.joshh.animal;
则对应的网站应该是:
joshh.ug
包名与文件夹门路的对应关系:
ug.joshh.animal 对应 ug/joshh/animal
应用 Packages 的益处是反对不同包内能够有同名的 class 文件,而不会混同
1.1 在 Intellij IDEA 中创立 Packages
参考 Creating a Package in IntelliJ
比拟具体
简略来说, 在 Intellij IDEA 中的操作即
File-->New-->Packages--> 输出包名(ug.joshh.animal)
1.2 应用 Packages
如果 Dog.class 所在的 Packages 为 ug.joshh.animal,则在包外应用 Dog.class 的话,须要申明标准名称,即
ug.joshh.animal.Dog d = new ug.joshh.animal.Dog(...);
也能够简写,前提是在文件顶部申明 import ug.joshh.animal.Dog;
就能够简写为:
Dog d = new dog();
1.3 Default Packages
任何在文件顶部没有显式包名的 Java 类都会主动被视为 Default Packages 的一部分。
如图所示, 所有非 ug.joshh.animal 包的 class 文件均视为 Default Packages
在理论开发中应该防止应用 Default Packages,因为 Default Packages 不能被 import,因而在 Default Packages 下很有可能创立雷同类名的文件
1.4 .jar 文件
如果你想与某人分享你的某个 project 的所有.class 文件,能够将其打包为 .jar 文件,相当于 .zip 文件,只不过前者领有一些额定的信息。
在 Intellij IDEA 中打包的办法为:
1.) Go to File → Project Structure → Artifacts → JAR →“From modules with dependencies”2.) Click OK a couple of times
3.) Click Build → Build Artifacts (this will create a JAR file in a folder called“Artifacts”)
4.) Distribute this JAR file to other Java programmers, who can now import it into IntelliJ (or otherwise)
参考 JAR Files
.jar文件并不能保障你的代码平安,因为其实质与 .zip 差不多,只需将其解压为.class 文件,之后能够轻松将.class 文件还原为.java 文件
2.Access Modifiers
以上列出了不同修饰符 (public protected private 与 ”packages private”) 之间的访问控制,其中彩色方块代表 packages private 类型,即在申明变量前不加任何修饰符,则该变量主动成为本包的公有变量,只有本包内的文件与同类能够拜访,在外包的 extends 的子类也不能拜访!
再次补充对于 Defalut Packages
事实上在咱们没有学习 Packages 之前,咱们创立的文件均相当于在默认包内,没有包申明的代码主动成为默认包的一部分。
如果这些类的成员没有 拜访修饰符 ,那么成员的默认类型为packages private 类型,因为所有的文件都是同一个默认包的一部分,这些成员在包内的不同 class 之间能够拜访,这就是咱们之前在未理解 Packages 之前为何代码可能良好运行的起因。
访问控制仅限于动态类型
下面咱们说如果在同一个包内,不申明拜访修饰符的变量,其默认类型是 package private,然而对于 Interface 来说,如果其成员不申明拜访修饰符,其默认类型是 public
除此之外,其余状况均如 副标题 所述 (the access depends only on the static types.)
小练习
察看上图代码,判断在 Client class 中的每一行是否可能失常编译,其中 BlackHole 和 CreationUtils 和 HasHair 位于同一个包 universe 内,而 class Client 位于默认包内。
次要剖析编译谬误的两行代码
1. b.get(0);
b 的动态类型是 BlackHole,编译时编译器查看 BlackHole 是否有 get() 办法 – 没有,编译谬误
2. HasHair hb = (HasHair) b;
按情理来说,当咱们应用强制类型转换之后,编译器会漠视 b 本来的类型,而间接通过编译,然而在此处,因为 HasHair 是位于 package universe 内的,且整个 class 未声明拜访修饰符,因而 HasHair class 实际上是 package private 类型,因而在默认包中无法访问, 因为默认包对于 universe 包来说相当于外包了。