使用public关键字时它意味着紧随在public后面的成员声明适用于所有人特别是适用于使用库的客户程序员假定我们定义了一个名为dessert的包其中包含下述单元(若执行该程序时遇到困难请参考第章小节赋值) //: Cookiejava // Creates a library package cdessert; public class Cookie { public Cookie() { Systemoutprintln(Cookie constructor); } void foo() { Systemoutprintln(foo); } } ///:~ 请记住Cookiejava必须驻留在名为dessert的一个子目录内而这个子目录又必须位于由CLASSPATH指定的C目录下面(C代表本书的第章)不要错误地以为Java无论如何都会将当前目录作为搜索的起点看待如果不将一个作为CLASSPATH的一部分使用Java就不会考虑当前目录 现在假若创建使用了Cookie的一个程序如下所示 //: Dinnerjava // Uses the library import cdessert*; public class Dinner { public Dinner() { Systemoutprintln(Dinner constructor); } public static void main(String[] args) { Cookie x = new Cookie(); //! xfoo(); // Cant access } } ///:~ 就可以创建一个Cookie对象因为它的构建器是public的而且类也是public的(公共类的概念稍后还会进行更详细的讲述)然而foo()成员不可在Dinnerjava内访问因为foo()只有在dessert包内才是友好的 默认包 大家可能会惊讶地发现下面这些代码得以顺利编译——尽管它看起来似乎已违背了规则 //: Cakejava // Accesses a class in a separate // compilation unit class Cake { public static void main(String[] args) { Pie x = new Pie(); xf(); } } ///:~ 在位于相同目录的第二个文件里 //: Piejava // The other class class Pie { void f() { Systemoutprintln(Pief()); } } ///:~ 最初可能会把它们看作完全不相干的文件然而Cake能创建一个Pie对象并能调用它的f()方法!通常的想法会认为Pie和f()是友好的所以不适用于Cake它们确实是友好的——这部分结论非常正确但它们之所以仍能在Cakejava中使用是由于它们位于相同的目录中而且没有明确的包名Java把象这样的文件看作那个目录默认包的一部分所以它们对于目录内的其他文件来说是友好的 |