类既不可以是private也不可以是protected(内部类除外),所以它只有两种权限:包访问权限或public,如果不希望任何人访问,就把所有的构造器都指定为private,从而阻止任何人都创建对象。有了这一点,你会发现有趣的事情,那就是我们可以掌握创建对象的数量,考虑下面一段代码:
text2.java文件:
package cantellow.text2;
public class text2
{
final public static int maxNumber = 5;
private static int i;
private int text;
{
text = 10;
System.out.println("在执行构造器之前,首先进行非静态字段的初始化:text="+text+"!");
}
static
{
i = 0;
System.out.println("第一次访问此类,生成一个CALSS对象,初始化静态成员i!");
}
private text2()
{
System.out.println("执行构造器!");
}
public static text2 makeText2()
{
if (i < maxNumber)
{
i++;
return new text2();
}
else
{
return null;
}
}
public int getI()
{
return i;
}
}
interface Foo {
public int x=0;
public void setNumber(int x);
}
text1.java文件:
package cantellow.text1;
import cantellow.text2.*;
public class text1 {
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
while(true)
{
text2 otext2 = text2.makeText2();
if (otext2 == null)
{
System.out.println("text2的对象已经达到"+text2.maxNumber+"个了!");
break;
}
else
{
System.out.println("已创建text2对象:"+otext2.getI());
}
}
}
}
可以直接复制运行,运行结果:
第一次访问此类,生成一个CALSS对象,初始化静态成员i!
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:1
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:2
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:3
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:4
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:5
text2的对象已经达到5个了!
看到没,我们想让它生成几个对象就生成了几个对象,因为创建text2对象只有一种途径,那就是调用makeText2()方法,而我们在调用这个方法创建text2对象之前还做了额外的工作,那就是判断已经创建text2对象的数量是否已经达到一定的数量,如果条件成立就继续创建,否则就返回null。
我们还可以只创建一个对象,考虑下面代码:
class Soup
{
private Soup(){}
private static Soup ps1 = new Soup();
public static Soup access()
{
return ps1;
}
}
当我们访问Soup的静态方法Soup.access()时:Soup pri3 = Soup.access();Soup类就开始被加载,加载之后就开始初始化静态字段:private static Soup ps1 = new Soup();在这个过程中,并没有创建Soup对象,它只是返回了一个静态的对象ps1,而在这之后,无论用什么方法都不可能再创建另外一个Soup类对象,除非修改底层代码。