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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈国华 中级黑马   /  2014-11-15 00:21  /  1101 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

静态方法只能访问静态成员?疑问
为什么静态方法只能访问静态成员,目前的回答主要是一下原因
    类的静态方法随类的加载而加载,也就是说类创建了,静态方法就
存在在方法区了,可是可能这个时候还没有进行对象的初始化,既然
没有对象初始化,那对象的成员变量,成员方法自然就不存在,静态方
法就访问不了,。。。如果你实例化对象了,成员方法自然可以访问静
态的,因为它早存在了。。。
    疑问如代码中所示:
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();
        }
}
    以上建立了对象再用新建的对象调用静态方法来访问非静态
成员为什么程序会报错?(此时对象的非静态成员已经初始化了啊)

评分

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

查看全部评分

4 个回复

倒序浏览
public static void speak()
        {
                System.out.println("name="+name);
        }
后面的name = this.name
要建立对象才能调用,而静态函数随着类的加载而加载在方法区,优于对象存在。也就是先加载静态,后面再创建对象。而System.out.println("name="+name);里面有成员变量,需要先建立对象。变成了先对象,在静态了。所以编译失败:lol

评分

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

查看全部评分

回复 使用道具 举报
有陷阱快跑丶 发表于 2014-11-15 09:26
public static void speak()
        {
                System.out.println("name="+name);

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

估计是访问的时候出错的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马