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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Fc10232 中级黑马   /  2012-5-17 18:09  /  4176 人查看  /  26 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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方法   

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

26 个回复

倒序浏览
额  先想想this是指代什么,this是指将要创建的那个对象,也就是说,在类被加载的时候,this指代的这个对象是还没有产生的,只有new关键字之后对象才产生,而static是在类加载进内存中的时候,它所修饰的内容就一起被加载进景泰区里面了
那么,其实可以看出来了,static修饰的内容是先于对象产生的,而且,某一个对象使用完了,被虚拟机销毁了,只要类的信息还存在内存里,那么,static修饰的内容就业还存在。。。

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

希望能帮到你,O(∩_∩)O~

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
this是对象的引用,而static方法是一个类的方法,不是哪个特定对象的方法,因此在static方法里使用this引用没意义。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载时,对象还不一定存在。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
我想你的意思是static方法中为什么不能用this关键字吧?
我是这么理解的:你想一下this是什么作用?是在一个类方法中代表当前对象,而static是不属于任何一个对象的。是全部该类对象所共有的;
虽然不知道java内部源码,可以想一下:应该是this在一个方法中先得到该类的当前对象,再操作该对象的方法,或变量;
所以在static中不可能得到当前对象是不?就不可能让你用this了!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
汗················  这个我也明白  
那假如里面有个对象的引用类??
比如单例设计里  不是通过静态方法得到私有对象??
  然后不就可以通过这个对象调用其他的 ??
回复 使用道具 举报
袁冬梅 发表于 2012-5-17 18:18
额  先想想this是指代什么,this是指将要创建的那个对象,也就是说,在类被加载的时候,this指代的这个对象 ...

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

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


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

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


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

哦,你说的还是不太明白,
是在单例设计模式中,是通过静态方法得到的私有对象!
然而你说可以通过着这对象调用其他?要注意这里的单例设计模式是为了让类只有一个实例!所以得到的私有对象都是同一块内存的!所以这个对象的引用也是静态的。关于你说的什么意思,真不大明白。举个例子如何?
回复 使用道具 举报
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: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: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方法   
回复 使用道具 举报
于潇 发表于 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方法   
回复 使用道具 举报
Fc10232 发表于 2012-5-17 19:31
class Person{
        private static Person p = new  Person();
        private Person(){}

是从gep()获得的引用。获得的是p的引用。怎么没有对象?在加载时new person()就运行了!也就是说在没有调  Person.getp().print();的时候,这个对象就有了在内存里!调用这些代码是建立个指向这个对象的引用!
回复 使用道具 举报
梁小波 发表于 2012-5-17 19:39
是从gep()获得的引用。获得的是p的引用。怎么没有对象?在加载时new person()就运行了!也就是说在没 ...

那是不是调用了非staitc方法?
回复 使用道具 举报
Fc10232 发表于 2012-5-17 19:31
class Person{
        private static Person p = new  Person();
        private Person(){}

囧,public static Person getp(){                     
这句话就是static修饰的呀,怎么还说是非static方法?你说的非静态方法是指哪里?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马