zoukankan      html  css  js  c++  java
  • 为什么不能从静态的方法里面调用非静态方法,或变量?

    程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。

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

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

    分类 性质 内存分配时机 访问方式
    静态成员(变量和方法) 类本身 类加载的时候就会分配内存 可以通过类名直接去访问
    非静态成员(变量和方法) 类的对象 类的对象产生(创建类的实例) 通过类的对象(实例)去访问

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

        由引导类加载器负责加载的核心类比如 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()方法执行完,整个程序退出。

  • 相关阅读:
    使用Xshell为xftp开ssh通道代理
    linux下查找svn的相关目录的命令
    linux服务器A远程连接服务器B的mysql及1045错误
    怎样下载带权限认证的文件?
    Vue项目打包部署总结
    Vue项目打包压缩:让页面更快响应
    axios请求失败自动重发
    可用的后台管理系统
    vue组件间方式总结
    非脚手架创建vue项目,并使用webpack打包
  • 原文地址:https://www.cnblogs.com/douyunpeng/p/13656453.html
Copyright © 2011-2022 走看看