龙空技术网

java 核心技术-12版 卷Ⅰ- 4.8.5 包访问

CC躺平混吃 119

前言:

此时我们对“java核心包是什么”大概比较关注,我们都想要知道一些“java核心包是什么”的相关知识。那么小编也在网上搜集了一些对于“java核心包是什么””的相关内容,希望小伙伴们能喜欢,小伙伴们快快来学习一下吧!

原文4.8.5 包访问

前面已经见过访问修饰符 public 和 private 。标记为public 的部分可以由任意类使用;标记为private 的部分职能由定义它们的类使用。如果没有指定 public 和 private ,这个部分(类、方法或变量)可以由同一个包中的所有方法访问。

下面再来考虑程序清单4-2。在这个程序中,没有将Employee 类定义为公共类,因此只有在同一个包(在此是无名包)中的其他类(例如EmployeeTest)可以访问这个类。对于类来说,这种默认方式是合乎情理的。但是,对于变量来说就有些不合时宜了,变量必须显式地标记为private ,不然将默认为包可访问。显然,这样会破坏封装性。问题是人们经常忘记键入关键字private 。以 java.awt包中的Window 为例(java.awt 包是jdk 提供的源代码的一部分):

public class Window extends Container{	String waringString;  // ...}

请注意,这里的warningString 变量不是private ! 这意味着java.awt 包中的所有类的方法都可以访问该变量,并将它设置为任意值(例如,“Trust me !”)。实际上,只有WIndow 类的方法访问这个变量,因此本应该将它设置为私有变量才合适。可能是程序员敲代码时匆忙之中忘记 private 修饰符了?也可能没人关心这个问题?已经20多年了,这个变量仍然不是私有变量。不仅如此,这个类还陆续增加了一些新的字段,而其中大约一半也不是私有的。

这可能会成为一个问题。在默认情况下,包不是封闭的实体。也就是说,任何人都可以向包中添加更多的类。当然,有恶意或糟糕的程序员很可能利用包访问添加一些能修改变量的代码。例如,在Java 程序设计语言的早起版本中,只需要将以下这条语句放在类文件的开头,就可以很容易地在java.awt 包中混入其他类:

package java.awt;

然后,把得到的类放置在类路径上某处的java/awt 子目录下,这样就 可以访问java.awt 包的内部了。使用这一手段,完全可以修改警告字符串。

从1.2 版开始,jdk 的实现者修改了类加载器,明确地禁止加载包名以"java."开头的用户自定义类!当然,用户自定义的类无法从这种保护中受益。另一种机制是让jar 文件声明包为密封的(sealed),以防止第三方修改,但这种机制已经过时。现在应当使用模块封装。我们会在卷2的第9章详细讨论模块。

标签: #java核心包是什么