包
- 作用
- 使用package将类组织起来,借助于包可以将自己定义的类进行统一的管理,还可以与其他外部导入的包进行区分
- 使用原因
- 确保类名的唯一性,与xml中的namespace是同一个道理.
- 如何让包名独一无二呢,您可以选择
公司的因特网域名以逆序的形式来作为包名,并且不同的项目使用不同的包名
这也是SUN公司所建议的.
4.7.1 包的引入
- 一个类可以使用所属包中的所有类,以及其他包中的公有类.我们可以采用两种方式来访问另一个包中的类名.
-
- 每个类名前添加完整的类名
但这显然是费劲的.
- 每个类名前添加完整的类名
-
java.time.LocalDate today = java.time.LocalDate.now();
- 2.使用import进行导入你想要的类
-
import java.time.LocalDate;
- 注意:指定包下的特定类名易于读者的理解你具体导入了那个类
- 另外,要注意的是
- 有些类名是同名的,但不属于不同的包
- -
java.util和java.ql中的Date类
- 你也不能两个包都导入;
- 否则编译会出错误
- -
Date date;
//Error–java.util.Date or java.sql.Date?
- 编译器是不知道程序使用的是哪个类.
那要是两个类都要使用呢
-答案是:每个类名签名加上完整的包名
import java.util.*;
import java.sql.*;
java.util.Datedeadline= new java.util.Date();
在包中定位类是编译器的工作.类文件中的字节码肯定使用完整的包名来引用其他的类.
4.7.2 静态导入
import不仅可以导入类,还增加了导入静态方法和静态域的功能.
import static java.lang.System.*;
就可以使用System中的静态方法和静态域,而不需要加类名前缀.
out.println(“hello world”);
- 但这有似乎不利于代码的清晰度.
所以不太建议
4.7.3 将类放到包中
- 如果想要将一个类放入到包中,就必须将包的名字放在源文件的开头,包中定义类的代码之前.
- 实例:
上图是放置在默认包中的一个A类,默认包时没有名称的包;
查看classpath下的包结构就可以得出以上结论:
- 可以看出在默认包中的A类是直接放置在src目录下的裸露的一个类,且默认包default是没有名称的包
4.7.4 包作用域
被标记为public的部分可以被任意的类使用;标记为private的部分只能被自己类使用;没有指明public或private则是default,被他修饰的部分(类,方法,变量)可以被同一个包中的所有方法访问,以及父类子类之间是可以访问的.
包存在的问题
- 在默认情况下,包不是一个封闭的实体.任何人都可以向包中添加更多的类.当然.有敌意的程序员可以利用包的可见性,添加一些具有修改代码功能的代码.这一弊端是极其危险的.
可以使用一下语句放在类文件的开头,就可以很容易地将其他类混入到你想要攻击的包中
package java.awt
好在,从1.2版本开始,JDK的实现这修改了类加载器,明确地禁止加载用户自定义的、包名以”java.”开头的类!当然了用户自定义的类是无法从这种保护中受益.
- 然而.用户可以通过包密封(package sealing)机制来解决将各种包混杂在一起的问题.如何将一个包密封起来呢,请听下回分解;