网站首页 > 精选教程 正文
原文
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章详细讨论模块。
猜你喜欢
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.3相等测试与继承
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.4 hashCode方法
- 2024-11-28 Java入门书单
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3.7 隐式参数与显式参数
- 2024-11-28 全网最完整的免费java教程讲义系列(四)——java的流程控制
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.6 对象构造 4.6.1重载
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 3.10 数组
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3 自定义类
- 2024-11-28 2019年Java核心技术我整理了200多页pdf,今天分享给你
- 2024-11-28 java 核心技术12版卷1 - 1.3 Java applet 与 Internet
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)