黑马程序员技术交流社区

标题: 关于面向对象的一些问题 [打印本页]

作者: 北京南瓜    时间: 2015-3-12 15:28
标题: 关于面向对象的一些问题
  1. class Person
  2. {
  3. public static void speak()
  4. {
  5. System.out.println("speak chinese");
  6. }
  7. }
  8. class PersonDemo
  9. {
  10. //Person p= new Person();
  11. public static void main(String[] args)
  12. {
  13. Person p= new Person();
  14. p.speak();
  15. }

  16. }
复制代码
这样运行是没问题的,可是把Person对象移到主函数外为什么运行不成功?
  1. class Person
  2. {
  3. public static void speak()
  4. {
  5. System.out.println("speak chinese");
  6. }
  7. }
  8. class PersonDemo
  9. {
  10. Person p= new Person();
  11. public static void main(String[] args)
  12. {
  13. //Person p= new Person();
  14. p.speak();
  15. }

  16. }
复制代码


12345.jpg (23.73 KB, 下载次数: 2)

12345.jpg

作者: pop1234o    时间: 2015-3-12 15:38
静态方法只能引用静态成员变量
作者: 北京南瓜    时间: 2015-3-12 15:40
pop1234o 发表于 2015-3-12 15:38
静态方法只能引用静态成员变量

p在这里不是变量而是创建的Person对象。。。
作者: yangruijing    时间: 2015-3-12 15:46
因为主函数是静态函数,不能调用非静态成员,静态函数是随着类的加载而加载的,在静态函数中调用非静态成员,将会发生找不到成员变量的错误。若非要将Person的实例化在主函数外面创建,就要将实例化对象定义为静态的。不过这样的话会有点浪费内存空间,因为Person对象的生命周期,将会是从程序运行开始直到程序结束。
将实例化对象定义在主函数外的程序如下:
class PersonDemo{
        static Person pt=new Person();
        public static void main(String agrs[]){
                pt.speek();//speek();
        }
       
}
class Person{
        public void speek()
        {
                System.out.println("hahaha");
        }
}
作者: 北京南瓜    时间: 2015-3-12 15:58
yangruijing 发表于 2015-3-12 15:46
因为主函数是静态函数,不能调用非静态成员,静态函数是随着类的加载而加载的,在静态函数中调用非静态成员 ...

嗯,刚才运行了一下确实可以,不过static貌似不是只能修饰成员函数和成员变量吗
作者: vayne    时间: 2015-3-12 16:03
静态方法只能引用静态成员变量,因为他们的创建时期不一样
作者: 北京南瓜    时间: 2015-3-12 16:09
vayne 发表于 2015-3-12 16:03
静态方法只能引用静态成员变量,因为他们的创建时期不一样

关键我这个p不是成员变量啊
作者: yangruijing    时间: 2015-3-12 16:21
北京南瓜 发表于 2015-3-12 15:58
嗯,刚才运行了一下确实可以,不过static貌似不是只能修饰成员函数和成员变量吗 ...

Person p=new Person();
p也是一个变量啊,只不过是一个Person类型的引用变量而已
作者: pop1234o    时间: 2015-3-12 16:44
北京南瓜 发表于 2015-3-12 15:40
p在这里不是变量而是创建的Person对象。。。

你这个是成员变量,只不过他是Person类型的
作者: 北京南瓜    时间: 2015-3-12 18:18
yangruijing 发表于 2015-3-12 16:21
Person p=new Person();
p也是一个变量啊,只不过是一个Person类型的引用变量而已 ...

好吧,这两天看的视频都快把我搞晕了
作者: 北京南瓜    时间: 2015-3-12 18:19
pop1234o 发表于 2015-3-12 16:44
你这个是成员变量,只不过他是Person类型的

恩,知道了,thank you!
作者: vayne    时间: 2015-3-13 15:44
你这就就有点水来




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