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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何旭程 中级黑马   /  2013-3-12 20:20  /  1492 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何旭程 于 2013-3-13 09:57 编辑

class StaticTest2
{
        int num = 4;

        void show()
        {
                System.out.println(num);
        }

        public static void main(String[] args)
        {
                //show();
                new StaticTest2().show();
        }
}

在静态方法内部不能访问非静态成员,为什么创建对象就可以调用了呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

正序浏览
一、非静态成员在对象创建之前还不存在,你不能访问不存在的东西。
二、随着对象的创建,非静态成员加载到堆内存中,这时就能访问了。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
不要好意思,刚才图片没有发上去

a.jpg (1.09 MB, 下载次数: 11)

a.jpg
回复 使用道具 举报
c:\a.jpg
回复 使用道具 举报
因为静态方法它是优先对象存在的,而且它随着类的加载而加载。也就是说,静态方法先存在内存方法区里,
而对象要通过创建一个对象才存在于堆内存中。所以先来的是不能访问后到的。而后来的就可以访问先到的!!!
回复 使用道具 举报

  1. class StaticTest2
  2. {
  3.         int num = 4;
  4.                
  5.                 //非静态方法编译器会隐式地把它变成show(StaticTest2 this)
  6.                 //也就是说非静态方法一定要与对象相关联。即对象调用非静态方法。
  7.         void show()
  8.                 {
  9.                 System.out.println(num);
  10.         }
  11.                 public static void main(String[] args)
  12.         {                //由于主方法是静态的,直接加载进内存,就没有产生对象,
  13.                                 //要调用非静态方法就一定有了该类的实例,就要创建对象。
  14.                 //show();
  15.                 new StaticTest2().show();//
  16.         }
  17. }

复制代码
静态方法可以看作是类的方法,而非静态成员可以看作是对象的方法或变量
只有当创建了某个对象的时候才能够使用,静态方法可以通过类名来直接调用。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
在静态方法内部不能访问非静态成员,为什么创建对象就可以调用了呢?
  这是因为类的静态成员会随着类的加载而加载进了内存的方法区,而非静态方法(实例成员)会在使用new 完对象后才完成赋值,所以静态方法内部不能出现非静态成员,
非静态成员要在创建完对象后,才存在,所以...

评分

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

查看全部评分

回复 使用道具 举报
没创建对象的话num还没有呢,show方法不能访问没有的东西,创建完对象后,就会对类进行初始化,会在堆中创建一个实例对象,然后就可以对这个对象进行访问了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马