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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 石好强 中级黑马   /  2012-4-1 18:28  /  4086 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Single
  2. {

  3.         static private int num ;
  4.        
  5.          void setNum( int num)    //求解此处为何不能 静态。明明上面num就是静态的啊
  6.         {
  7.                 this.num = num;
  8.        
  9.         }
  10.        
  11.          private Single()
  12.         {
  13.                 setNum(20);
  14.         }
  15.        
  16.          static private Single s = new Single();
  17.        
  18.         public static Single getInstance()
  19.         {
  20.                 return s;   
  21.         }                       
  22.                                        
  23.        
  24.         static  int getNum()
  25.         {
  26.                 return num;
  27.        
  28.         }
  29.        
  30.        

  31. }

  32. class  SingleDemo
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                 Single s1 =Single.getInstance();        
  37.                 Single s2 = Single.getInstance();
  38.                 Single s3 = Single.getInstance();//s1, s2 , s3 其实都是同一个对象。
  39.                
  40.                 System.out.println("num="+Single.getNum());
  41.                 System.out.println("s1.num="+s1.getNum());
  42.                 System.out.println("s2.num="+s2.getNum());
  43.                
  44.                 s1.setNum(22);
  45.                
  46.                 System.out.println("num="+Single.getNum());
  47.                 System.out.println("s1.num="+s1.getNum());
  48.                 System.out.println("s2.num="+s2.getNum());
  49.                
  50.                
  51.         }
  52. }
复制代码
求解 下面这段代码注释处为何不能静态,全部代码是上面那些,我不明白为什么这儿不能静态啊,上面是静态,全定义成静态应该相互能访问啊?

        static private int num ;
       
         void setNum( int num)    //求解此处为何不能 静态。明明上面num就是静态的啊
        {
                this.num = num;
       
        }
       

25 个回复

倒序浏览
没人知道么。。。。。。。。。。。。。。。。。。。。。求解答,顶下,别沉了
回复 使用道具 举报
本帖最后由 袁野 于 2012-4-1 21:51 编辑

   void setNum( int num)  这里的num是局部变量啊!不是 static private int num ;的
所以嘛 可以的
静态方法和静态变量只能在静态方法里使用,

定义在方法上和方法内部的变量都是局部变量 必须初始化赋值

当成员变量和局部变量相同时,就近原则,自己方法有的变量 ,就不会去找成员的啦
回复 使用道具 举报
袁野 发表于 2012-4-1 21:48
void setNum( int num)  这里的num是局部变量啊!不是 static private int num ;的
所以嘛 可以的
静态 ...

我还是有点晕。我是想不用创建对象 直接 类调用 Single.setNum(22); 是想在主函数方法里这样使用,我就想把setNum静态这样就能类调用了,可是静态之后提示不能访问了,能讲具体点么
回复 使用道具 举报
石好强 发表于 2012-4-1 22:01
我还是有点晕。我是想不用创建对象 直接 类调用 Single.setNum(22); 是想在主函数方法里这样使用,我就想 ...

不可以的~给你讲下哦
void setNum( int num)  
要想通过类名.setNum(int num) 这个方法 此方法必须是静态的
可是 参数 不可能为静态的,因为静态只能在成员变量 ,成员函数上 定义,而你的参数是局部的 你懂了么?

回复 使用道具 举报
多看看毕老师的视频吧,比我说的还要明白,有问题的看,肯定收获的很好 ,加油
回复 使用道具 举报
void setNum( int num)   
{
       this.num = num;  //若是静态的话,方法里是不能用this关键字的     
}

回复 使用道具 举报
袁野 发表于 2012-4-1 22:19
多看看毕老师的视频吧,比我说的还要明白,有问题的看,肯定收获的很好 ,加油 ...

谢谢,明白很透彻了。只能定义于 成员变量 和 成员函数。 老师的视频我看了,也看的很仔细,但是细节上还是不能全记住,哎。回去挨个找这个细节,耗费时间太大,我零基础但必须要上5月份的9期,时间上太紧迫了,只能多提问了,还想拿技术分哈。谢谢,非常感谢!
回复 使用道具 举报
刘基军 发表于 2012-4-1 22:29
void setNum( int num)   
{
       this.num = num;  //若是静态的话,方法里是不能用this关键字的     

?我刚明白了 静态只能修饰 成员变量和成员函数。这里不能静态是因为 有局部变量造成了,还有其他原因?
请详细解释下,可以么
回复 使用道具 举报
这题跟局部变量没关系的  主要是静态方法里不能使用this引用,因为静态方法先于对象存在的,你将代码改成
static void setNum(int num){
      Single.num=num;
} 就不会报错了
回复 使用道具 举报
袁野 黑马帝 2012-4-1 22:43:45
11#
石好强 发表于 2012-4-1 22:41
?我刚明白了 静态只能修饰 成员变量和成员函数。这里不能静态是因为 有局部变量造成了,还有其他原因?
...

若这个方法是静态的 则不可以使用this因为 this是属于对象的
回复 使用道具 举报
adison 黑马帝 2012-4-1 22:49:29
12#
this表示当前对象,所以要用this必须要实例化出一个对象来,而静态方法是先于对象存在的,即静态方法在该类加载进内存时就已经存在了,这时可能还没有创建该类的对象,所以不能使用this,同理,super也不能在静态方法中出现
回复 使用道具 举报
static private int num ;
        
         void setNum( int num)    //求解此处为何不能 静态。明明上面num就是静态的啊
        {
                this.num = num;
        
        }



如果静态的话,那么类一加载,这个方法就会加载

但是this.num中this是指调用这个方法的对象,所以类加载时,方法void setNum( int num)加载必然的前提条件是有对象调用它

但是一开始类加载的时候,肯定没有对象,如果设为静态的话,就自相矛盾,编译会报错
回复 使用道具 举报
程旦 发表于 2012-4-1 22:42
这题跟局部变量没关系的  主要是静态方法里不能使用this引用,因为静态方法先于对象存在的,你将代码改成
s ...

谢谢,讲的很好,Single.num 的确不会报错了,也可以在下面调用了。
回复 使用道具 举报
guojun_sun 发表于 2012-4-1 22:50
static private int num ;
        
         void setNum( int num)    //求解此处为何不能 静态。明明上 ...

谢谢。。。。
回复 使用道具 举报
袁野 发表于 2012-4-1 22:43
若这个方法是静态的 则不可以使用this因为 this是属于对象的

大家的回答都很好,咱们理解错了。的确是这样更有道理:

静态先于对象执行,对象建立时已经存在于方法区了,所以用 this. 的话,就相当于在执行static void setNum(int num)的时候还没有这个对象,所以编译报错。这个可以静态 ,但是要用Single.setNum(22);这样来调用。哈哈,又学到了不少!
回复 使用道具 举报
adison 发表于 2012-4-1 22:49
this表示当前对象,所以要用this必须要实例化出一个对象来,而静态方法是先于对象存在的,即静态方法在该类 ...

谢谢,有道理
回复 使用道具 举报
你要是在这个方法上加了static,那么这个方法里面就不能用this了,因为this是指当前的引用,而被static修饰的成员都会在类加载的时候就加载,在new对象之前执行,所以在static 方法里面当然不能有this这个对象的引用了
回复 使用道具 举报
回答的好完整了,看帖留个言
回复 使用道具 举报
class Single
{

        static private int num ;
        
         void setNum( int num)    //求解此处为何不能 静态。明明上面num就是静态的啊
        {
                this.num = num;
        
        }
        
         private Single()
        {
                setNum(20);
        }
  在这个程序中,从表面上看你如果在 void setNum( int num) 上添加静态的话,你在下边调用时也必须用静态修饰 private Single()。静态方法或成员只能在静态里引用。而在这个程序中显然这不是主要错误,主要错误是在静态方法中不能使用this关键字,因为静态成员在对象建立之前就已经存在于方法区了,而这时他在使用this调用当前对象时就会出错(当前对象还不存在)。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马