黑马程序员技术交流社区

标题: static就是没有this的方法。。。 为什么? [打印本页]

作者: Fc10232    时间: 2012-5-17 18:09
标题: static就是没有this的方法。。。 为什么?
本帖最后由 Fc10232 于 2012-5-17 19:35 编辑

如题。。   


class Person{
        private static Person p = new  Person();
        private Person(){}
        public static Person getp(){                     
                return p;
        }
        public void print(){
                System.out.println("hello world");
        }
        
}
public class Demo01 {
        public static void main(String[] args) {
               
            Person.getp().print();


        }

}
这个是从getp()  获得的引用吧?  是不是调用了非static方法   
作者: 袁冬梅    时间: 2012-5-17 18:18
额  先想想this是指代什么,this是指将要创建的那个对象,也就是说,在类被加载的时候,this指代的这个对象是还没有产生的,只有new关键字之后对象才产生,而static是在类加载进内存中的时候,它所修饰的内容就一起被加载进景泰区里面了
那么,其实可以看出来了,static修饰的内容是先于对象产生的,而且,某一个对象使用完了,被虚拟机销毁了,只要类的信息还存在内存里,那么,static修饰的内容就业还存在。。。

这样的话,你想一下,你出现的时候那个this指代的东西还没出现呢,你怎么能使用那个东西呢?

希望能帮到你,O(∩_∩)O~
作者: 于潇    时间: 2012-5-17 18:18
this是对象的引用,而static方法是一个类的方法,不是哪个特定对象的方法,因此在static方法里使用this引用没意义。
作者: 田林    时间: 2012-5-17 18:20
因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载时,对象还不一定存在。
作者: 梁小波    时间: 2012-5-17 18:22
我想你的意思是static方法中为什么不能用this关键字吧?
我是这么理解的:你想一下this是什么作用?是在一个类方法中代表当前对象,而static是不属于任何一个对象的。是全部该类对象所共有的;
虽然不知道java内部源码,可以想一下:应该是this在一个方法中先得到该类的当前对象,再操作该对象的方法,或变量;
所以在static中不可能得到当前对象是不?就不可能让你用this了!
作者: Fc10232    时间: 2012-5-17 18:33
汗················  这个我也明白  
那假如里面有个对象的引用类??
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以通过这个对象调用其他的 ??
作者: Fc10232    时间: 2012-5-17 18:34
袁冬梅 发表于 2012-5-17 18:18
额  先想想this是指代什么,this是指将要创建的那个对象,也就是说,在类被加载的时候,this指代的这个对象 ...

汗················  这个我也明白  
那假如里面有个对象的引用呢??
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以通过这个对象调用其他的 ??
作者: Fc10232    时间: 2012-5-17 18:34
于潇 发表于 2012-5-17 18:18
this是对象的引用,而static方法是一个类的方法,不是哪个特定对象的方法,因此在static方法里使用this引用 ...

  
那假如里面有个对象的引用类??
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以通过这个对象调用其他的 ??
作者: Fc10232    时间: 2012-5-17 18:34
梁小波 发表于 2012-5-17 18:22
我想你的意思是static方法中为什么不能用this关键字吧?
我是这么理解的:你想一下this是什么作用?是在一 ...


那假如里面有个对象的引用
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以通过这个对象调用其他的 ??
作者: Fc10232    时间: 2012-5-17 18:35
梁小波 发表于 2012-5-17 18:22
我想你的意思是static方法中为什么不能用this关键字吧?
我是这么理解的:你想一下this是什么作用?是在一 ...

那假如里面有个对象的引用
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以通过这个对象调用其他的 ??
作者: Fc10232    时间: 2012-5-17 18:38
怎么没人说话了???
作者: 袁冬梅    时间: 2012-5-17 18:52
Fc10232 发表于 2012-5-17 18:34
汗················  这个我也明白  
那假如里面有个对象的引用呢??
比如单例设计里   ...


首先,单例模式为什么叫做单例模式,就是因为这个类只能存在一个对象,所以,不用static来获取这个对象,那么岂不是一个类可以获取到N多对象了?
然后,后面两句我实在没搞懂什么意思,你可以弄一个小代码把你想表达 的思想表达一下么,我看看你的代码,才能知道你说的是什么情况,再具体分析
作者: 梁小波    时间: 2012-5-17 19:02
Fc10232 发表于 2012-5-17 18:35
那假如里面有个对象的引用
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以通过这个 ...

哦,你说的还是不太明白,
是在单例设计模式中,是通过静态方法得到的私有对象!
然而你说可以通过着这对象调用其他?要注意这里的单例设计模式是为了让类只有一个实例!所以得到的私有对象都是同一块内存的!所以这个对象的引用也是静态的。关于你说的什么意思,真不大明白。举个例子如何?
作者: 于潇    时间: 2012-5-17 19:15
Fc10232 发表于 2012-5-17 18:34
那假如里面有个对象的引用类??
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以 ...
  1. class Single
  2. {


  3.         private  Single(){}

  4.         private static Single s = new Single();

  5.         public static  Single getInstance()
  6.         {
  7.                 return s;
  8.         }
  9. }


  10. class SingleDemo
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                 Single s1 = Single.getInstance();
  15.                 Single s2 = Single.getInstance();

  16.                 s1.setNum(23);

  17.                 System.out.println(s2.getNum());


  18.                
  19. //                Single s1 = new Single();
  20. //                Single s2= new Single();
  21. //                s1.setNum(30);
  22. //                System.out.println(s2.getNum());

  23. //                Student s1 = new Student();
  24. //                s1.setAge(30);
  25. //
  26. //                Student s2 = new Student();
  27. //                s2.setAge(12);

  28.                 Student s1 = Student.getStudent();
  29.                 Student s2 = Student.getStudent();

  30.                


  31.         }
  32. }



  33. class Student
  34. {
  35.         private int age;


  36.         private static Student s = new Student();
  37.         private Student(){}
  38.         public static Student getStudent()
  39.         {
  40.                 return s;
  41.         }



  42.         public void setAge(int age)
  43.         {
  44.                 this.age = age;
  45.         }
  46.         public int getAge()
  47.         {
  48.                 return age;
  49.         }
  50. }
复制代码
这是毕老师的单例代码,你所说的通过静态得到私有对象是指?
作者: Fc10232    时间: 2012-5-17 19:31
本帖最后由 Fc10232 于 2012-5-17 19:36 编辑
梁小波 发表于 2012-5-17 19:02
哦,你说的还是不太明白,
是在单例设计模式中,是通过静态方法得到的私有对象!
然而你说可以通过着这对 ...

class Person{
        private static Person p = new  Person();
        private Person(){}
        public static Person getp(){                     
                return p;
        }
        public void print(){
                System.out.println("hello world");
        }
        
}
public class Demo01 {
        public static void main(String[] args) {
               
            Person.getp().print();


        }

}
你看  是从gep()  获得的引用吧?  是不是调用了非static方法   
作者: Fc10232    时间: 2012-5-17 19:31
本帖最后由 Fc10232 于 2012-5-17 19:36 编辑
袁冬梅 发表于 2012-5-17 18:52
首先,单例模式为什么叫做单例模式,就是因为这个类只能存在一个对象,所以,不用static来获取这个对象, ...

class Person{
        private static Person p = new  Person();
        private Person(){}
        public static Person getp(){                     
                return p;
        }
        public void print(){
                System.out.println("hello world");
        }
        
}
public class Demo01 {
        public static void main(String[] args) {
               
            Person.getp().print();


        }

}
你看  是从gep()  获得的引用吧?  是不是调用了非static方法   
作者: Fc10232    时间: 2012-5-17 19:37
于潇 发表于 2012-5-17 19:15
这是毕老师的单例代码,你所说的通过静态得到私有对象是指?

class Person{
        private static Person p = new  Person();
        private Person(){}
        public static Person getp(){                     
                return p;
        }
        public void print(){
                System.out.println("hello world");
        }
        
}
public class Demo01 {
        public static void main(String[] args) {
               
            Person.getp().print();


        }

}
你看  是从gep()  获得的引用吧?  是不是调用了非static方法   
作者: 梁小波    时间: 2012-5-17 19:39
Fc10232 发表于 2012-5-17 19:31
class Person{
        private static Person p = new  Person();
        private Person(){}

是从gep()获得的引用。获得的是p的引用。怎么没有对象?在加载时new person()就运行了!也就是说在没有调  Person.getp().print();的时候,这个对象就有了在内存里!调用这些代码是建立个指向这个对象的引用!

作者: Fc10232    时间: 2012-5-17 19:41
梁小波 发表于 2012-5-17 19:39
是从gep()获得的引用。获得的是p的引用。怎么没有对象?在加载时new person()就运行了!也就是说在没 ...

那是不是调用了非staitc方法?
作者: 袁冬梅    时间: 2012-5-17 19:43
Fc10232 发表于 2012-5-17 19:31
class Person{
        private static Person p = new  Person();
        private Person(){}

囧,public static Person getp(){                     
这句话就是static修饰的呀,怎么还说是非static方法?你说的非静态方法是指哪里?
作者: Fc10232    时间: 2012-5-17 19:49
袁冬梅 发表于 2012-5-17 19:43
囧,public static Person getp(){                     
这句话就是static修饰的呀,怎么还说是非static ...

static里的一个引用调用了非static的方法···是不?
作者: Fc10232    时间: 2012-5-17 19:49
袁冬梅 发表于 2012-5-17 19:43
囧,public static Person getp(){                     
这句话就是static修饰的呀,怎么还说是非static ...

static里的一个引用调用了非static的方法···是不?
作者: 梁小波    时间: 2012-5-17 19:53
Fc10232 发表于 2012-5-17 19:41
那是不是调用了非staitc方法?

我刚刚解释得很明白了,实际上没有调非static方法,只是返回了一个引用p。new person()是在main程序运行前就创建了对象。
作者: 袁冬梅    时间: 2012-5-17 19:54
Fc10232 发表于 2012-5-17 19:49
static里的一个引用调用了非static的方法···是不?

Person.getp().print();
总算懂了,你说的是这句话是吧。

我帮你还原一下这句话吧,我觉得还原出来之后,你基本能懂整一个表达式的意思了
Person p = Person.getp();
P.print();

这样的话,看得懂了吧, Person.getp()的返回值是一个Person对象,所以,后面调用的print()其实是对象调用的,而不是静态方法调用。。咳咳,而且方法也不能调用方法吧。O(∩_∩)O~
作者: Fc10232    时间: 2012-5-17 19:58
袁冬梅 发表于 2012-5-17 19:54
Person.getp().print();
总算懂了,你说的是这句话是吧。

可以这样还原么·······
作者: 于潇    时间: 2012-5-17 20:06
Fc10232 发表于 2012-5-17 19:37
class Person{
        private static Person p = new  Person();
        private Person(){}

这跟单例有什么关系么?而且这也不是通过getp()获得的方法啊
作者: 8161776    时间: 2012-5-18 23:51
static修饰的属性,他不属于任何一个对象,它随着类的加载已经加载进来了,它是公共的,而this关键字是当前对象,




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