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 times3.) 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包来说相当于外包了。