当前位置: 首页 > 后端技术 > Java

cs61bweek6--PackagesandAccessControl

时间:2023-04-01 22:54:48 Java

1.Java中的Packages,Packages是管理类和接口的命名空间(namespace),包名正好和网站名相反,例如:ug.joshh.animal;对应的网址应该是:joshh.ug包名和文件夹路径的对应关系:ug.joshh.animal对应ug/joshh/animal使用Packages的好处是支持不同包中同名的class文件,不会混淆CreatingPackagesinIntellijIDEA中的1.1参考CreatingaPackageinIntelliJ更多细节。简单来说,IntellijIDEA中的操作就是File-->New-->Packages-->输入包名(ug.joshh.animal)1.2如果Dog.class所在的Packages是ug.joshh.animal,则使用Packages.如果在包外使用Dog.class,需要声明规范名称,即ug.joshh.animal.Dogd=newug.joshh.animal.Dog(...);也可以简写,前提是importug.joshh.animal.Dog;在文件顶部声明,可以简写为:Dogd=newdog();1.3默认包任何在文件顶部没有显式包名称的Java类都将自动被视为默认包的一部分。如图所示,所有非ug.joshh.animal包的类文件都被视为DefaultPackages。实际开发中应该避免使用DefaultPackages,因为DefaultPackages无法导入,所以很可能会在DefaultPackages1.4下创建相同类名的.jar文件如果你想把你的一个项目的所有.class文件共享给有人,你可以把它们打包成.jar文件,相当于.zip文件,只是前者多了一些信息。IntellijIDEA中的打包方法是:1.)GotoFile→ProjectStructure→Artifacts→JAR→“Frommoduleswithdependencies”2.)点击OK几次3.)点击Build→BuildArtifacts(这会创建一个JAR文件放在名为“Artifacts”的文件夹中)4.)将此JAR文件分发给其他Java程序员,他们现在可以将其导入IntelliJ(或其他)引用JAR文件。和.zip类似,解压成.class文件,然后就可以很方便的把.class文件还原成.java文件2.AccessModifiers上面列出了不同的修饰符之间(publicprotectedprivate和“packagesprivate”)访问控制,其中黑色方块代表包的私有类型,即声明变量前不加修饰符,则该变量自动成为包的私有变量,只有包内的同类文件才能访问访问不了,外包的extends子类也访问不了!再次,添加关于DefalutPackages。其实在我们学习Packages之前,我们创建的文件就相当于在默认包中,没有包声明的代码自动成为默认包的一部分。如果这些类的成员没有访问修饰符,那么成员的默认类型就是packages私有类型,因为所有文件都是同一个默认包的一部分,这些成员可以在包内的不同类之间访问,即我们之前说的为什么不理解Packages也能很好的运行代码。访问控制仅限于静态类型上面我们说过,如果在同一个包中声明了一个没有访问修饰符的变量,那么它的默认类型就是packageprivate,但是对于Interface来说,如果它的成员没有声明访问修饰符,那么它的默认类型就是除了public,其他情况如小标题所述(访问只依赖静态类型。)观察上图代码判断Client类中每一行是否能正常编译的小练习,其中其中BlackHole和CreationUtils和HasHair位于同一个包universe中,类Client位于默认包中。主要分析编译错误的两行代码1.b.get(0);b的静态类型是BlackHole,编译器在编译时会检查BlackHole是否有get()方法——没有,编译错误2.HasHairhb=(HasHair)b;按理来说,当我们使用强制类型转换时,编译器会忽略b的原始类型,直接编译,但是这里,由于HasHair位于包域中,而整个类并没有声明访问修饰符,所以HasHair类实际上是包私有类型,所以在default包中是访问不到的,因为default包相当于外包给了universe包。