A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐长智 中级黑马   /  2013-1-3 20:43  /  2316 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐长智 于 2013-1-3 21:10 编辑

为什么不能在
l = new Lanhan();
的l之前写上类名Lanhan呢?
  1. class Lanhan{
  2.         private Lanhan(){

  3.         }
  4.         private static Lanhan l = null;
  5.         public static Lanhan getLanhan(){
  6.                 if(l == null){
  7.                         l = new Lanhan();
  8.                            //Lanhan l = new Lanhan();
  9.                 }
  10.                 return l;
  11.         }
  12.         public void Dayin(){
  13.                 System.out.println("我是懒汉");
  14.         }
  15. }
复制代码

评分

参与人数 1黑马币 +12 收起 理由
崔政 + 12

查看全部评分

12 个回复

倒序浏览
本帖最后由 刘文超 于 2013-1-3 21:04 编辑

lz你好,
需要说的是,我觉得你大意了,把局部变量和静态变量混在一起了。
上边定义了 static Lanhan l=null、下边再从新定义局部变量 Lanhan l,他俩不是一个呀、
后来再返回 static的l,相当于对static的什么没做、第一次调用返回初始值null;
代码中也有相应注释:
  1. package org.qyx.online;

  2. public class TestLanhan {
  3.         public static void main(String []args){
  4.                 Lanhan.getLanhan().Dayin();
  5.         }
  6.         
  7. }

  8. class Lanhan{
  9.     private Lanhan(){

  10.     }
  11.     private static Lanhan l = null;
  12.     public static Lanhan getLanhan(){
  13.             if(l == null){
  14.                   l = new Lanhan();//此处的l是private私有静态变量;
  15.                   //Lanhan l = new Lanhan();//这里定义l只是静态方法里面的一个普通的变量而已,和类的私有静态变量l不是一个;
  16.                   //lz这么写只不过是创建了一个局部变量,让它自生自灭而已;
  17.             }
  18.             return l;//此处返回的仍然是私有静态变量,而对于类的私有静态变量l来讲,上边代码却没有做任何事情;
  19.     }
  20.     public void Dayin(){
  21.             System.out.println("我是懒汉");
  22.     }
  23. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
因为你第5行已经定义l的类型了,不能重复定义一个变量,这是常识。

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1

查看全部评分

回复 使用道具 举报
如果说你写这么一句Lanhan l = new Lanhan();
等于说又重新声明了个变量l,局部位置的l覆盖了原来的全局的l
意思是l为空时,新创建一个l,退出if,新创建的l引用就不存在了,然后返回原来的null
所以这个类永远都没有对象
回复 使用道具 举报
你好,因为你的L变量已经定义过了,如果你在指定类型的话会提示你已被定义。
所以就不要在写LanHan了。
回复 使用道具 举报
刘文超 发表于 2013-1-3 20:49
lz你好,
需要说的是,我觉得你大意了,把局部变量和静态变量混在一起了。
上边定义了 static Lanhan l=nul ...

懂了,你讲的好详细,谢谢。
回复 使用道具 举报
肖志锋 发表于 2013-1-3 21:03
因为你第5行已经定义l的类型了,不能重复定义一个变量,这是常识。

o,谢谢
回复 使用道具 举报
唐长智 发表于 2013-1-3 21:09
懂了,你讲的好详细,谢谢。

是嘛、我说的好多、都怕把你绕蒙了。。
找到原因就好,加油~
回复 使用道具 举报
  1. 为什么不能在
  2. l = new Lanhan();
  3. 的l之前写上类名Lanhan呢?
复制代码
首先,Lanhan l=new Lanhan();//是实例化一个Lanhan类。
而 l=new Lanhan();//是将Lanhan()的方法值传递给l。
回复 使用道具 举报
刘文超 发表于 2013-1-3 21:18
是嘛、我说的好多、都怕把你绕蒙了。。
找到原因就好,加油~

你是怎么把整个代码贴上来的呀,怎么弄的啊             我每次都是复制代码  根本看不到前面的行号
回复 使用道具 举报
惠晖 发表于 2013-1-3 23:23
你是怎么把整个代码贴上来的呀,怎么弄的啊             我每次都是复制代码  根本看不到前面的行号 ...

点红色框里的按钮,把代码复制进去就可以了

回复 使用道具 举报
当然不能写上l  如果写上了  外面你定义的那个 Lanhan l= null;  中的l  会仍然为null
如果在第9行 写的是 Lanhan l= new Lanhan();  那这l 的作用域只是第7行到第10行的if语句里面 外面的l  的值仍然为NULL

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先说 那个不是不能写  new Lanhan()  写可以这么写 编译不会报错
但是他的作用域就在那个if语句块里面   那么你这样写就没什么意义了   他跟外面定义的static是两码事
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马