黑马程序员技术交流社区

标题: 静态方法能访问非静态方法? [打印本页]

作者: 曾祥旭    时间: 2013-4-4 22:36
标题: 静态方法能访问非静态方法?
本帖最后由 曾祥旭 于 2013-4-5 07:29 编辑

我们在学到静态的时候,毕老师曾说:静态方法只能访问静态成员。
但是,为什么我在创建静态方法的时候可以访问到非静态成员方法呢?如下代码:
class Person {
public static void method() {
  new Person().run();
}
public void run() {
}
}


作者: luguoyuanf    时间: 2013-4-4 22:43
静态方法时不能访问非静态的,原因是静态方法随着类的加载进入方法区的静态区,而非静态方法要在被new创建对象后进入到对内存中.所以静态只能访问静态,非静态可以访问静态.静态优先于非静态.
作者: 刘印12    时间: 2013-4-4 22:46
首先你创建了Person对象  而你的非静态方法定义在了person对象内 当然能访问了
如果你按一下方法调用就不行了
class Person{
   public static void method(){
        run();//错误
    }
   public void run(){}
}
作者: arthur    时间: 2013-4-4 22:47
这个应该是在静态方法里new了一个非静态对象,再用这个对象调用非静态方法
作者: 伊廷文    时间: 2013-4-4 22:50
因为run()方法属于person类的一个方法, new Person().run();等同于
person p=new Person();p.run();在这新建了一个对象实例就是p,用p调用run方法
作者: 范鹏飞    时间: 2013-4-4 23:01
静态方法只能访问静态方法,不能访问非静态方法。new Person().run();相当于创建了一个Person类的对象,通过对象调用的run()方法。
作者: 王川    时间: 2013-4-4 23:16
  1. class Person{
  2.         public static void method() {
  3.                 new Person().run();
  4.         }

  5.         public void run() {
  6.         }

  7.         public static void main(String[] args) {
  8.                 new Person().run();
  9.         }
  10. }
复制代码
静态方法是不可以调用非静态方法的。反过来倒可以
你这个意思跟在main方法(static的)中创建对象,然后访问run方法类似。是属于对象访问方法,而不是在静态方法中直接调用非静态方法
作者: 杨成    时间: 2013-4-4 23:25
method() 是个静态函数,不依赖于对象而存在。而你在这个函数中new Person(),创建了一个Person类对象,run()方法是Person类的非静态函数,非静态的函数是依赖于对象存在的,对象必须实例化之后,它才会在内存中存在。你 new Person().run()等于是创建了一个Person类对象并调用Person类的非静态成员函数,所以会发生这个状况!




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