java的类会见
在Java中,亦可用会见指示符判定出一个库内的哪些类可由谁人库的用户利用。若想一个类能由客户措施员挪用,可在类主体的起始花括号前面某处安排一个public要害字。它节制着客户措施员是否可以或许建设属于这个类的一个工具。
为节制一个类的会见,指示符必需在要害字class之前呈现。所以我们可以或许利用:
public class Widget {
也就是说,假使我们的库名是mylib,那么所有客户措施员都能会见Widget——通过下述语句:
import mylib.Widget;
可能
import mylib.*;
然而,我们同时还要留意到一些特另外限制:
(1) 每个编译单位(文件)都只能有一个public类。每个编译单位有一个民众接口的观念是由谁人民众类表达出来的。按照本身的需要,它可拥有任意多个提供支撑的“友好”类。但若在一个编译单位里利用了多个public类,编译器就会向我们提示一条堕落动静。
(2) public类的名字必需与包括了编译单位的谁人文件的名字完全相符,甚至包罗它的巨细写形式。所以对付Widget来说,文件的名字必需是Widget.java,而不该是widget.java可能WIDGET.java。同样地,假如呈现不符,就会陈诉一个编译期错误。
(3) 大概(但并常见)有一个编译单位基础没有任何民众类。此时,可按本身的意愿任意指定文件名。
假如已经得到了mylib内部的一个类,筹备用它完成由Widget可能mylib内部的其他某些public类执行的任务,此时又会呈现什么环境呢?我们不但愿耗艰辛气为客户措施员体例文档,并感受今后某个时候也许会举办大手笔的修改,并将本身的类一起删掉,换成另一个差异的类。为得到这种机动处理惩罚的本领,需要担保没有客户措施员可以或许依赖本身埋没于mylib内部的特定实施细节。为到达这个目标,只需将public要害字从类中剔除即可,这样便把类酿成了“友好的”(类仅能在包内利用)。
留意不行将类设成private(那样会使除类之外的其他对象都不能会见它),也不能设成protected(注释④)。因此,我们此刻对付类的会见只有两个选择:“友好的”可能public。若不肯其他任何人会见谁人类,可将所有构建器设为private。这样一来,在类的一个static成员内部,除本身之外的其他所有人都无法建设属于谁人类的一个工具(注释⑤)。如下例所示:
//: Lunch.java // Demonstrates class access specifiers. // Make a class effectively private // with private constructors: class Soup { private Soup() {} // (1) Allow creation via static method: public static Soup makeSoup() { return new Soup(); } // (2) Create a static object and // return a reference upon request. // (The "Singleton" pattern): private static Soup ps1 = new Soup(); public static Soup access() { return ps1; } public void f() {} } class Sandwich { // Uses Lunch void f() { new Lunch(); } } // Only one public class allowed per file: public class Lunch { void test() { // Can't do this! Private constructor: //! Soup priv1 = new Soup(); Soup priv2 = Soup.makeSoup(); Sandwich f1 = new Sandwich(); Soup.access().f(); } } ///:~
④:实际上,Java 1.1内部类既可以是“受到掩护的”,也可以是“私有的”,但那属于出格环境。第7章会具体表明这个问题。
⑤:亦可通过从谁人类担任来实现。
迄今为止,我们建设过的大大都要领都是要么返回void,要么返回一个根基数据范例。所以对下述界说来说:
public static Soup access() {
return psl;
}
它最开始几多会使人有些疑惑。位于要领名(access)前的单词指出要领到底返回什么。在这之前,我们看到的都是void,它意味着“什么也不返回”(void在英语里是“虚无”的意思。但亦可返回指向一个工具的句柄,此时呈现的就是这个环境。该要领返回一个句柄,它指向类Soup的一个工具。
Soup类向我们展示出如何通过将所有构建器都设为private,从而防备直接建设一个类。请记着,假使不明晰地至少建设一个构建器,就会自动建设默认构建器(没有自变量)。若本身编写默认构建器,它就不会自动建设。把它酿成private后,就没人能为谁人类建设一个工具。但别人奈何利用这个类呢?上面的例子为我们展现出了两个选择。第一个选择,我们可建设一个static要领,再通过它建设一个新的Soup,然后返回指向它的一个句柄。假如想在返回之前对Soup举办一些特另外操纵,可能想相识筹备建设几多个Soup工具(大概是为了限制它们的个数),这种方案无疑是出格有用的。
第二个选择是回收“设计方案”(Design Pattern)技能,本书后头会对此举办具体先容。凡是方案叫作“独子”,因为它仅答允建设一个工具。类Soup的工具被建设成Soup的一个static private成员,所以有一个并且只能有一个。除非通过public要领access(),不然基础无法会见它。
正如早先指出的那样,假如不针对类的会见配置一个会见指示符,那么它会自动默认为“友好的”。这意味着谁人类的工具可由包内的其他类建设,但不能由包外建设。请记着,对付沟通目次内的所有文件,假如没有明晰地举办package声明,那么它们都默认为谁人目次的默认包的一部门。然而,假使谁人类一个static成员的属性是public,那么客户措施员仍然可以或许会见谁人static成员——纵然它们不能建设属于谁人类的一个工具。