构造器是用来创建对象的,而关键字public等是用来限制类,成员方法或者成员属性的访问权限的。所以,当你给构造器设置一个权限后,你的客户程序员如果想创建你设计的类的一个对象(实例),则他就会受到相应的限制了。一般的,都会设置为public的,如果使用“单体”的设计模式,则会设置为pirvate的。protected的,是在包中和子类中“可见”(即,可以访问)。

解决方案 »

  1.   

    访问权限我懂,但是当权限用到构造器中,代表什么呢?如果为protect,当构造时跟public有什么区别?在一般的方法中我懂
      

  2.   

    如果为protect,当构造时跟public有什么区别?在一般的方法中我懂我觉得,将构造函数的权限设为protected,其用意是希望告诉客户程序员:你最好不要直接创建我的实例,我给你另外一个选择——请继承于我吧。另外,还有一种情况是,类中存在多个构造函数,但是其中的某些是不希望客户程序员直接引用或者修改的。所以,就会把他们设置为private, protected了。不知道,解释的是否合理。
      

  3.   

    一般说来用public的话是可以直接构造用protected的话不允许直接构造,会提供一个工厂静态方法返回一个实例,
    但也可能是用于子类继承方便
      

  4.   

    如果为pirvate,则该对象不能直接实例化,也不能被继承。
      

  5.   

    大家说得都对,我在补充一点。
    private, protected或无访问属性的构造函数,通常是辅助构造函数,不能直接调用。通常由其他构造函数调用,或像Lovedandan说的那样,用一个工厂静态方法返回实例,你用Eclipse察看JRE里的awt,swing类库就会发现好多这样的用法。这就是protected,和无属性对‘包外调用’的保护。例如:
    在temp包内的Test有三种访问属性的constructor(private不考虑了)
    把Test.java 放在D;\temp下编译
    Test代码如下:
    package temp;
    public class Test 
    {
    protected Test()
    {
    System.out.println("Hello World!");
    }
    Test(int i)
    {
    System.out.println("Hello World!"+i);
    }
    public Test(String s)
    {
    System.out.println("Hello World!"+s);
    }}
    然后,在Test2中调用Test,把Test2放在d:\编译,你会发现提示错误中有t2,t3, 都是无法访问,但是提示不一样。 
    Test2.java如下
    import temp.Test;class Test2 
    {
    public static void main(String[] args) 
    {
    Test t1 = new Test("ff");
    Test t2 = new Test(1);
    Test t3 = new Test();
    }
    }
    这就是protected,和无属性对包外调用的保护。
    而对于包内调用就无此保护了,因为Java设计者认为包内对象之间耦合度紧密。例如Test4 调 Test3,代码如下:
    注,把Test3和Test4放在同一目录下(同一包内),编译Test4
    class Test3 
    {
    protected Test3(int i)
    {
    System.out.println("Yes, you can create me" + i);
    }
    Test3(String s)
    {
    System.out.println("Yes, you can create me" + s);
    }
    public Test3()
    {
    System.out.println("Yes, you can create me");
    }
    }class Test4 
    {
    public static void main(String[] args) 
    {
    Test3 t1 = new Test3(1);
    Test3 t2 = new Test3("ff");
    Test3 t3 = new Test3();
    }
    }
    你会发现,运行正常,没问题。
    因此,magu所说“将构造函数的权限设为protected,其用意是希望告诉客户程序员:你最好不要直接创建我的实例,我给你另外一个选择——请继承于我吧。”是片面的,因为这个类可能有其他构造函数是公有的,所以仍然可以被构造,哪怕就算只有一个protected的constructor,仍然可以被包内的对象构造。
    喔,手好累,不写了。
      

  6.   

    DanielYWoo()说的不错。我们可以通过控制访问权限来控制类之间/包之间的耦合度。不过,对于我来说,如果我希望别人创建我的类的实例,我会比较大方的给他一个public权限的。:)。这样,我的其他兄弟用起来会比较直观,比较放心的。呵呵!
      

  7.   

    看design pattern java companion的singleton模式:)
    楼上说的都挺对.
      

  8.   

    java菜鸟到此一游,受益非浅啊,呵呵