构造器是用来创建对象的,而关键字public等是用来限制类,成员方法或者成员属性的访问权限的。所以,当你给构造器设置一个权限后,你的客户程序员如果想创建你设计的类的一个对象(实例),则他就会受到相应的限制了。一般的,都会设置为public的,如果使用“单体”的设计模式,则会设置为pirvate的。protected的,是在包中和子类中“可见”(即,可以访问)。
解决方案 »
- HashSet遍历
- 是父类对象还是子类对象?
- 为什么我的JBuilder里的Database Pilot不可用啊?
- 说说大家的年终奖吧
- 几个小问题?希望大家能帮我改正一下
- java查询、删除和修改怎么写啊、
- 如何控制多窗体应用程序中各子窗体尺寸的改变?
- 问个问题,eclips可以象jbuilder一样可视化开发吗?如果可以哪里有插件
- BasicStroke初始参数的设置??
- 请问哪儿有java2技术核心 卷II 高级特性下载?在线等待
- 大家好我是刚刚学电脑语言 给点提示吗 c++/c/c#/java 啊 谢谢
- [Xalan + XPath]XPathAPI.selectNodeIterator()抛出TransformerException的奇怪问题
但也可能是用于子类继承方便
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,仍然可以被包内的对象构造。
喔,手好累,不写了。
楼上说的都挺对.