黑马程序员技术交流社区

标题: 关于静态方法只能访问静态成员 [打印本页]

作者: 陈国华    时间: 2014-11-15 00:21
标题: 关于静态方法只能访问静态成员
静态方法只能访问静态成员?疑问
为什么静态方法只能访问静态成员,目前的回答主要是一下原因
    类的静态方法随类的加载而加载,也就是说类创建了,静态方法就
存在在方法区了,可是可能这个时候还没有进行对象的初始化,既然
没有对象初始化,那对象的成员变量,成员方法自然就不存在,静态方
法就访问不了,。。。如果你实例化对象了,成员方法自然可以访问静
态的,因为它早存在了。。。
    疑问如代码中所示:
class Person1
{
        String name = "zhangsan";
        static String cn = "china";
        public static void speak()
        {
                System.out.println("name="+name);
        }
}
class Person1Demo
{
        public static void main(String[] args)
        {
                Person1 p1 = new Person1();
                p1.speak();
        }
}
    以上建立了对象再用新建的对象调用静态方法来访问非静态
成员为什么程序会报错?(此时对象的非静态成员已经初始化了啊)
作者: 有陷阱快跑丶    时间: 2014-11-15 09:26
public static void speak()
        {
                System.out.println("name="+name);
        }
后面的name = this.name
要建立对象才能调用,而静态函数随着类的加载而加载在方法区,优于对象存在。也就是先加载静态,后面再创建对象。而System.out.println("name="+name);里面有成员变量,需要先建立对象。变成了先对象,在静态了。所以编译失败:lol

作者: 陈国华    时间: 2014-11-15 12:11
有陷阱快跑丶 发表于 2014-11-15 09:26
public static void speak()
        {
                System.out.println("name="+name);

谢谢,有道理
作者: wf111sxwf    时间: 2014-11-15 13:20
你在静态方法中访问了非静态的成员,这个类在加载的时候就会出错,因为静态函数会随着类的加载而加载,这个时候  name 还没有初始化,这也静态方法也就不会加载成功,程序也就挂了
作者: 陈国华    时间: 2014-11-15 16:34
wf111sxwf 发表于 2014-11-15 13:20
你在静态方法中访问了非静态的成员,这个类在加载的时候就会出错,因为静态函数会随着类的加载而加载,这个 ...

估计是访问的时候出错的




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