请问
下面是单例设计模式,懒汉式的一段代码,
为什么把s=new Single()写出Single s=new Single();就会编译错误;
是什么原因?谢谢!class Single
{
private int age;
public void setAge(int age)
{
this.age=age;
}

public int getAge()
{
return age;
}
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();    //这里如果是Single s=new Single();就会编译错误;为什么呢?
return s;
}
}

解决方案 »

  1.   

    要不就直接在这行private static Single s=new Single();
    静态方法不能实例化对象
      

  2.   

    挺有意思,之前不知道可能是编译器里有优化?不知道,因为确实在if 或 while下不加大括号的情况下,在条件体内创建新新的引用没有任何意义,因为此引用只是在条件体内局部可见,之外不可用,所以这种做法是无用的即错误的你可以试试,你在if后加上大括号,将Single s=new Single();放入,是不会有编译错误的,但你getInstance返回的是null,不能达到你要的效果
      

  3.   

    这个问题在《java解惑》一书中有提到,java不允许一个变量声明语句作为一条语句在for、while或do循环中重复执行
      

  4.   

    private static Single s=null;
    Single s=new Single();
    我觉得应该是这两句重复定义了Single s.
      

  5.   

    因为你有个全局变量:private static Single s = null;方法里再定义个局部变量也叫s。另外还有你这个单例最好加上synchronizedpublic static synchronized Single getInstance() {
    ...............
    }
      

  6.   

    if(s==null){
    Single s=new Single(); }
    return s;
    加上大括号呀!!!! 
    这点千万不能懒呀!!否则意思就变啦。。
      

  7.   

    你已经定义过了,private static Single s=null;
    不能再定义
      

  8.   

    楼主之前是学了C或C++的吧?
    {
      int i = 0;
      {
         int i = 0;
      }
    }
    这种写法在C和C++里就没有问题,但是在JAVA里就不行,因为JAVA的设计师们认为这样的定义方式会影响到程序代码的可读性
      

  9.   

    java是一夫多妻制 一个引用(或者对象实例就是妻子)能对应对个变量(夫),反之不行
    所以
    People p1 = new People("楼主");
    People p2 = p1;
    这样p1和p2对应的都是"楼主"这个实例,楼主就有2个"名字"啦~\(≧▽≦)/~但是
    People p1 = new People("楼主");
    People p1 = new People("不结贴的楼主");
    就会报错,因为,p1已经是楼主的名字了,不能再给别人用了~另外觉得那句话总结的很好
    有的人觉得编程语言应该能让程序员做任何事
    有的人觉得编程语言应该能防止程序员做"蠢事"java是后者的代表,所以,因为我是从java入门的,所以我觉得想突破自身就是要了解,java都防止我们做什么"蠢事"了,而且是怎样实现防止我们干"蠢事"的
      

  10.   

    楼上那些说是因为s在类里面已经定义过了,自己去试试
    public class Example

        static String s = null;
        public static void main(String[] args) throws IOException {
         if(true){
         String s = "s";
         }
        }
    }
    public class Example

        static String s = null;
        public static void main(String[] args) throws IOException {
         if(true)
         String s = "s";
        
        }
    }
      

  11.   


    楼上说得东西我还真没注意,刚才差了点资料.给大家分享.楼上的问题可以解释为
    Java 把 String s = "s"; 当两条语句看待了相当于 String s ; s = "";
    所以不加括号会出错
    具体的东西涉及到编译原理的一些知识
      

  12.   

    所以12说对了,出错的原因不是重新定义,是括号的问题
    楼主代码改成public static Single getInstance() {
    if (s == null){
    Single s = new Single(); // 这里如果是Single s=new Single();就会编译错误;为什么呢?
    }
    return s;
    }就不出编译期错误了
      

  13.   

    楼上说得东西我还真没注意,刚才差了点资料.给大家分享.楼上的问题可以解释为
    Java 把 String s = "s"; 当两条语句看待了相当于 String s ; s = "";
    所以不加括号会出错
    具体的东西涉及到编译原理的一些知识
    所以12说对了,出错的原因不是重新定义,是括号的问题
    楼主代码改成public static Single getInstance() {
    if (s == null){
    Single s = new Single(); // 这里如果是Single s=new Single();就会编译错误;为什么呢?
    }
    return s;
    }就不出编译期错误了
      

  14.   

    建议好好看看设计模式singleton。原理很简单,你不理解代码是因为不知道原理,看这里:
    http://baike.baidu.com/view/1859857.htm
    上面回答的几个人也都是不明白的。
    不用感谢组长,结贴吧。