明辉站/网站教程/内容

Java编程思想读书笔记(5章)

网站教程2024-01-12 阅读
[摘要]第5章 隐藏实现细节   一.Java访问权限饰词(access specifiers)    Java有public、protect、friendly、private四种访问权限,并且这四访问权限的访问范围越来越小。    1. friendly    1) 果一个class内的数据成员或方法没...
第5章 隐藏实现细节

  一.Java访问权限饰词(access specifiers)

   Java有public、protect、friendly、private四种访问权限,并且这四访问权限的访问范围越来越小。

   1. friendly

   1) 果一个class内的数据成员或方法没有任何权限饰词,那么它的缺省访问权限就是friendly。同一个package内的其它所有classes都可以访问friendly成员,但对package以外的classes则形同private。

   2)对于同一个文件夹下的、没有用package的classes,Java会自动将这些classes初见为隶属于该目录的default package,可以相互调用class中的friendly成员。如以下两个class分别在同一个文件夹的两个文件中,虽然没有引入package,但隶属于相同的default package。

   class Sundae{
   //以下两个方法缺省为friendly
   Sundae(){}
   Void f() {System.out.println(“Sundae.f()”);
   }
   public class IceCream{
   public static void main(String[] args){
   Sundae x = new Sundae();
   x.f();
   }
   }
   2. public:可以被任何class调用

   3. private:private成员只能在成员所属的class内被调用,如:

   class Sundae{
   private Sundae(){}//只能在Sundae class中被调用
   Sundae(int i) {}
   static Sundae makASundae() {
   return new Sundae();
   }
   }
   public class IceCream{
   public static void main(String[] args){
   // Sundae class中构造函数Sundae()是private,
   // 所以不能用它进行初始化
   //Sundae x = new Sundae();
   Sundae y = new Sundae(1);//Sundae(int)是friendly,可以在此调用
   Sundae z = Sundae.makASundae();
   }
   }
   4. protected:具有friendly访问权限的同时,又能被subclass(当然包括子孙类,即子类的子类)所访问。即,既能被同一package中的classes访问,又能被protected成员所在class的subclass访问。

   二.Class的访问权限

   1.Class同样具有public、protect、friendly、private四种访问访问权限:

   1)public:在任何地方都可被使用

   2)protect、private:除了它自己,没有任何class可以使用,所以class不能是

   protected或private(inner class除外)

   3) friendly:同一个package中的classes能用

   2. 如何调用构造函数被声明为private的class

   1) 用static函数

   2) 用Singteton模式

   class Soup{
   private Soup(){}
   //(1)静态函数方法
   public static Soup makeSout(){
   return new Soup();
   }
   //(2)The "Singleton" pattern:

   private static Soup ps1 = new Soup();
   public static Soup access(){
   return ps1;
   }
   public void f(String msg){
   System.out.println("f(" + msg + ")");
   }
   }
   public class Lunch{
   public static void main(String[] args){
   //Soup priv1 = new Soup();编译错误
   Soup priv2 = Soup.makeSout();
   Soup priv3 = Soup.access();
   priv2.f("priv2");
   priv3.f("priv3");
   }

……

相关阅读