知识大全 类访问

Posted

篇首语:未曾哭过长夜的人,不足以语人生。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 类访问相关的知识,希望对你有一定的参考价值。

  在Java中 亦可用访问指示符判断出一个库内的哪些类可由那个库的用户使用 若想一个类能由客户程序员调用 可在类主体的起始花括号前面某处放置一个public关键字 它控制着客户程序员是否能够创建属于这个类的一个对象     为控制一个类的访问 指示符必须在关键字class之前出现 所以我们能够使用     public class Widget     也就是说 假若我们的库名是mylib 那么所有客户程序员都能访问Widget——通过下述语句     import mylib Widget;    或者    import mylib *;    然而 我们同时还要注意到一些额外的限制     ( ) 每个编译单元(文件)都只能有一个public类 每个编译单元有一个公共接口的概念是由那个公共类表达出来的 根据自己的需要 它可拥有任意多个提供支撑的 友好 类 但若在一个编译单元里使用了多个public类 编译器就会向我们提示一条出错消息     ( ) public类的名字必须与包含了编译单元的那个文件的名字完全相符 甚至包括它的大小写形式 所以对于Widget来说 文件的名字必须是Widget java 而不应是widget java或者WIDGET java 同样地 如果出现不符 就会报告一个编译期错误     ( ) 可能(但并常见)有一个编译单元根本没有任何公共类 此时 可按自己的意愿任意指定文件名     如果已经获得了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()    // ( ) Allow creation via static method:   public static Soup makeSoup()     return new Soup();      // ( ) Create a static object and   // return a reference upon request    // (The Singleton pattern):   private static Soup ps = new Soup();   public static Soup access()     return ps ;      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 priv = new Soup();    Soup priv = Soup makeSoup();    Sandwich f = new Sandwich();    Soup access() f();      ///:~    ④ 实际上 Java 内部类既可以是 受到保护的 也可以是 私有的 但那属于特别情况 第 章会详细解释这个问题     ⑤ 亦可通过从那个类继承来实现     迄今为止 我们创建过的大多数方法都是要么返回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成员——即使它们不能创建属于那个类的一个对象 cha138/Article/program/Java/hx/201311/26502

相关参考

知识大全 运用设计模式构建通用数据库访问类

这就需要我们在实际开发过程中将这些数据库访问类再作一次封装经过这样的封装不仅可以达到上述的目标还可以减少操作数据库的步骤减少代码编写量在这个方面微软为我们提供了ApplicationBlock但是可惜

知识大全 请问申请到工作类签证(访问学者)后应该在多长时间内赴加拿大

请问申请到工作类签证(访问学者)后应该在多长时间内赴加拿大?在签证有效期内。访问学者从申请签证到拿到签证多长时间具体情况,具体分析。要看申请什么国家的访问学者签证。还要看是什么时候提交签证,以及具体的

知识大全 控制对类内部数据或函数成员访问的类

  publicclassProtectClassTest  publicstaticvoidmain(String[]args)throwsProtectClassNoAccessException

知识大全 对象“友好的”访问

  如果根本不指定访问指示符就象本章之前的所有例子那样这时会出现什么情况呢?默认的访问没有关键字但它通常称为友好(Friendly)访问这意味着当前包内的其他所有类都能访问友好的成员但对包外的所有类来

知识大全 很简短的几句就能访问文件输出文件

  importjavaio*;/*引用javaio包下所有类*/    publicclasstest/*classtest    publicstaticvoidmain(String[]args

知识大全 面向对象思想之 -- 限制对象属性的访问

  虽然Java只支持从一个父类继承但它使用接口的方式支持多重继承  接口实现了多态使得我们能够给与对象不同特性以满足不同的需要  你可以使用多态机制让完成相似功能的不同的方法拥有相同的名字但是拥有不

知识大全 不能接触

  private关键字意味着除非那个特定的类而且从那个类的方法里否则没有人能访问那个成员同一个包内的其他成员不能访问private成员这使其显得似乎将类与我们自己都隔离起来另一方面也不能由几个合作的

知识大全 继承protected

  现在我们已理解了继承的概念protected这个关键字最后终于有了意义在理想情况下private成员随时都是私有的任何人不得访问但在实际应用中经常想把某些东西深深地藏起来但同时允许访问衍生类的成员

知识大全 构造函数和析构函数

  类构造函数  本节将讨论三种类构造函数  类构造函数的类型  注释  实例  用于创建并初始化类的实例  私有  在类之外不可访问的特殊类型实例构造函数无法用私有构造函数来实例化类  静态  在创

知识大全 eclipse处理长字符串拼接快捷方法类

  情景  你在后台写sql文访问数据库时是不是要这样写  Stringsql=selecta  +b  +c  +fromtable;  Stringsql=selecta  +b  +c  +fr