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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾祥旭 中级黑马   /  2013-4-4 22:36  /  1873 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曾祥旭 于 2013-4-5 07:29 编辑

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

7 个回复

倒序浏览
静态方法时不能访问非静态的,原因是静态方法随着类的加载进入方法区的静态区,而非静态方法要在被new创建对象后进入到对内存中.所以静态只能访问静态,非静态可以访问静态.静态优先于非静态.
回复 使用道具 举报
首先你创建了Person对象  而你的非静态方法定义在了person对象内 当然能访问了
如果你按一下方法调用就不行了
class Person{
   public static void method(){
        run();//错误
    }
   public void run(){}
}
回复 使用道具 举报
这个应该是在静态方法里new了一个非静态对象,再用这个对象调用非静态方法
回复 使用道具 举报
因为run()方法属于person类的一个方法, new Person().run();等同于
person p=new Person();p.run();在这新建了一个对象实例就是p,用p调用run方法
回复 使用道具 举报
静态方法只能访问静态方法,不能访问非静态方法。new Person().run();相当于创建了一个Person类的对象,通过对象调用的run()方法。
回复 使用道具 举报
  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方法类似。是属于对象访问方法,而不是在静态方法中直接调用非静态方法

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
method() 是个静态函数,不依赖于对象而存在。而你在这个函数中new Person(),创建了一个Person类对象,run()方法是Person类的非静态函数,非静态的函数是依赖于对象存在的,对象必须实例化之后,它才会在内存中存在。你 new Person().run()等于是创建了一个Person类对象并调用Person类的非静态成员函数,所以会发生这个状况!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马