Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 947|回复: 0

静态方法为什么不能调用非静态成员

[复制链接]

该用户从未签到

发表于 2011-10-20 10:49:28 | 显示全部楼层 |阅读模式
程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。

类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:

而类又是在什么时候加载的呢?

    由引导类加载器负责加载的核心类比如 String 类在 JVM 启动时(main 方法开始执行前)就会被加载,其它类在使用前(new 它对象或调用其静态方法访问静态域等等前)会被动态加载,要注意的是子类被加载前它的所有超类要根据由父到子的顺序被逐一加载。

class A1
{
    public static int a=5;
}
class B1 extends A1
{
    public static int a=8;
    void print(){
        System.out.println(super.a);
        System.out.println(a);
    }
}
public class TestStatic
{
    public static void main(String args[])
    {
        System.out.println("b.a="+B1.a);
        System.out.println("b.a="+A1.a);
        new B1().print();
    }
}

就这段代码说一下.

就你上面的代码说一下:
当你在doc环境下输入:
java TestStatic时,
虚拟机会先加载TestStatic类,此时虚拟机会先看看TestStatic类有没有静态的字段,
没有,直接执行main方法。
main方法中第一句代码是打印B1.a,
虚拟机便会去找类B1,找到类B1时,虚拟机发现B1的父亲是A1,
于是父亲优先,先加载A1,
同样,在加载A1时,会看看A1中有什么静态的东西,有,
static int a = 5;
a是静态的,先加载,当把静态的字段加载完后,一个类就算加载完了,
所以A1已经加载完毕,以后不用在加载了。
父亲加载完了,轮到B1了,同样先看看里面有什么静态的字段,有,
static int a = 8;
此时B1也加载完毕了。
第一条打印语句到此时也执行完毕了,
轮到第二条打印语句了。
当执行new B1().print();这句时,
会发生动态绑定,
此时会有一个代表B1对象的this对象传递给print()方法,
所以print()方法中的
System.out.println(a);
其实是,
System.out.println(this.a);
会打印出一个8出来。
至于super.a就简单了,
打印父类中的a,
结果是5.
到此,main()方法执行完,整个程序退出。
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 20:13:31 | 显示全部楼层
谢谢分享啊。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-15 06:01 , Processed in 0.355149 second(s), 48 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表