黑马程序员技术交流社区

标题: 关于静态方法的一些疑惑 [打印本页]

作者: 何旭程    时间: 2013-3-12 20:20
标题: 关于静态方法的一些疑惑
本帖最后由 何旭程 于 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();
        }
}

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

作者: BitmapFactory    时间: 2013-3-12 20:25
没创建对象的话num还没有呢,show方法不能访问没有的东西,创建完对象后,就会对类进行初始化,会在堆中创建一个实例对象,然后就可以对这个对象进行访问了
作者: 谢玉成    时间: 2013-3-12 20:33
在静态方法内部不能访问非静态成员,为什么创建对象就可以调用了呢?
  这是因为类的静态成员会随着类的加载而加载进了内存的方法区,而非静态方法(实例成员)会在使用new 完对象后才完成赋值,所以静态方法内部不能出现非静态成员,
非静态成员要在创建完对象后,才存在,所以...
作者: 王龙涛    时间: 2013-3-12 21:00

  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. }

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


作者: HM周磊    时间: 2013-3-12 23:06
因为静态方法它是优先对象存在的,而且它随着类的加载而加载。也就是说,静态方法先存在内存方法区里,
而对象要通过创建一个对象才存在于堆内存中。所以先来的是不能访问后到的。而后来的就可以访问先到的!!!
作者: HM赵磊    时间: 2013-3-13 00:08
c:\a.jpg
作者: HM赵磊    时间: 2013-3-13 00:13
不要好意思,刚才图片没有发上去

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

a.jpg

作者: 李思杰    时间: 2013-3-13 00:14
一、非静态成员在对象创建之前还不存在,你不能访问不存在的东西。
二、随着对象的创建,非静态成员加载到堆内存中,这时就能访问了。




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