黑马程序员技术交流社区

标题: 关于静态的一个问题,求解 [打印本页]

作者: 石好强    时间: 2012-4-1 18:28
标题: 关于静态的一个问题,求解
  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;
       
        }
       
作者: 石好强    时间: 2012-4-1 20:17
没人知道么。。。。。。。。。。。。。。。。。。。。。求解答,顶下,别沉了
作者: 袁野    时间: 2012-4-1 21:48
本帖最后由 袁野 于 2012-4-1 21:51 编辑

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

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

当成员变量和局部变量相同时,就近原则,自己方法有的变量 ,就不会去找成员的啦
作者: 石好强    时间: 2012-4-1 22:01
袁野 发表于 2012-4-1 21:48
void setNum( int num)  这里的num是局部变量啊!不是 static private int num ;的
所以嘛 可以的
静态 ...

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

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


作者: 袁野    时间: 2012-4-1 22:19
多看看毕老师的视频吧,比我说的还要明白,有问题的看,肯定收获的很好 ,加油
作者: 刘基军    时间: 2012-4-1 22:29
void setNum( int num)   
{
       this.num = num;  //若是静态的话,方法里是不能用this关键字的     
}


作者: 石好强    时间: 2012-4-1 22:35
袁野 发表于 2012-4-1 22:19
多看看毕老师的视频吧,比我说的还要明白,有问题的看,肯定收获的很好 ,加油 ...

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

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

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



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

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

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

谢谢,讲的很好,Single.num 的确不会报错了,也可以在下面调用了。
作者: 石好强    时间: 2012-4-1 23:14
guojun_sun 发表于 2012-4-1 22:50
static private int num ;
        
         void setNum( int num)    //求解此处为何不能 静态。明明上 ...

谢谢。。。。
作者: 石好强    时间: 2012-4-1 23:18
袁野 发表于 2012-4-1 22:43
若这个方法是静态的 则不可以使用this因为 this是属于对象的

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

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

谢谢,有道理
作者: zhouxp3323    时间: 2012-4-1 23:25
你要是在这个方法上加了static,那么这个方法里面就不能用this了,因为this是指当前的引用,而被static修饰的成员都会在类加载的时候就加载,在new对象之前执行,所以在static 方法里面当然不能有this这个对象的引用了
作者: niceBoy    时间: 2012-4-1 23:43
回答的好完整了,看帖留个言
作者: 邓飞飞    时间: 2012-4-2 06:21
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调用当前对象时就会出错(当前对象还不存在)。
作者: 黑马老兵    时间: 2012-4-2 10:04
因为void setNum( int num)这句话中的num接收了一个外部的变量进来,你的语句this.num = num;
中就是把接收到的值赋给了你定义的静态num。
作者: 石好强    时间: 2012-4-2 10:15
邓飞飞 发表于 2012-4-2 06:21
class Single
{

谢谢回答。你和我都误解了,这里的确不能用this.或者super.来修饰,因为静态先于对象存在,此时使用this.和super来代表引用对象,是会报错的。而private Single(); 本身是不能用静态来修饰的,这个你可以试试。我想是因为类加载的时候本身private Single(); 也和静态一起存在于方法区了吧,这个我是这样认为的,还不是太透彻。
作者: 陈苓    时间: 2012-4-2 11:02
看了这你应该会明白的
Static关键字是什么?
1,        它是一个修饰符,只能修饰成员(成员变量和局部变量)。
2,        被static修饰的成员变量的数据,可以被对象们所共享。
3,        被静态修饰的成员多了一种调用方式,除了被对象调用以外,还可以被类名直接调用。
4,        静态之所以可以被类名调用,那是因为,静态成员是随着类的加载而加载进内存的。(非静态是随着对象的加载而加载进内存的)。
5,        在对象中存储的数据是特有数据,被static修饰的是共享数据。
6,        静态的优先于对象加载进内存。
静态的注意事项?
1,        静态成员函数只能访问类中的静态成员,不能访问非静态。
非静态方法即可访问静态,也可以访问非静态。
2,        静态方法中不可以定义this、super关键字。
因为静态优先于对象存在。所以静态方法中不可以出现this。
3,        主函数也是静态的。

作者: 马超    时间: 2012-4-2 12:50
首先你需要看懂静态使用的注意事项:
1.只能访问静态成员
非静态都可以访问
2.静态方法中不能出现this.super关键字
我给你个代码示例:
class Person
{
        String name;
        一、public static void show()
                {
                        System.out.println("haha");//show方法中没有访问到了非静态
                                                                                //的数据name,定义Static
                }
        二、public void show()
                {
                        System.out.println(name+"haha");//show方法中访问到了非静态
                                                                                //的数据name,不能定义Static
                }
}

class StaticDemo
{
        一、Person.show();
        二、Person p = new Person();
                p.show();
}
那么该功能可以定义成静态的。
*/
作者: yangshang1    时间: 2012-4-2 20:40

class Single

{


        static private int num ;

        
        static void setNum( int nu)    //求解此处为何不能 静态。明明上面num就是静态的啊

        {

                num = nu;

        
        }

        
         private Single()

        {

                setNum(20);

        }

        
         static private Single s = new Single();

        
        public static Single getInstance()

        {

                return s;   

        }                        
                                       
        
        static  int getNum()

        {

                return num;

        
        }

        
        

}


class  SingleDemo

{

        public static void main(String[] args)
        {

                Single s1 =Single.getInstance();         
                Single s2 = Single.getInstance();
                Single s3 = Single.getInstance();//s1, s2 , s3 其实都是同一个对象。

               
                System.out.println("num="+Single.getNum());

                System.out.println("s1.num="+s1.getNum());

                System.out.println("s2.num="+s2.getNum());

               
                Single.setNum(22);

               
                System.out.println("num="+Single.getNum());

                System.out.println("s1.num="+s1.getNum());

                System.out.println("s2.num="+s2.getNum());

               
               
        }

}
可以使静态啊
作者: 薛飞飞    时间: 2012-4-3 00:35
this是动态的,与静态static相冲突,二者只能用其一!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2