zoukankan      html  css  js  c++  java
  • Android-Java-静态变量与静态方法&普通变量与普通方法(内存图 完整版)

    描述Student对象:

    package android.java.oop12;
    
    // 描述Student对象实体
    public class Student {
    
        private String name;
    
        private int age;
    
        protected static String country = "CN";
    
        private Student() {}
    
        public Student(String name, int age) {
            /**
             * 通过拿到对象引用的地址(9998#==this),去操作 堆区内存的 name属性  age属性
             */
            this.name = name;
            this.age = age;
        }
    
        public void showValue() {
            /**
             * 通过拿到对象引用的地址(9998#==this),去操作 堆区内存的 name属性  age属性
             */
            System.out.println("name:" + this.name + " age:" + age);
        }
    
        public static void printlnCountry() {
            /**
             * 通过类名就可用拿到 ---> 方法区(共享数据区) --> 中的 静态区 里面的 --> 静态数据 ,都是共享的
             */
            System.out.println("country:" + Student.country);
            System.out.println("country:" + country);
        }
    
    }

    main测试方法:

    package android.java.oop12;
    
    public class TestDemo {
    
        public static void main(String[] args) {
    
            /**
             * 实例化Student对象         new Student("张三", 89);
             * 拿到实例化对象引用的地址    Student student == 9998#
             */
            Student student = new Student("张三", 89);
    
            /**
             * 通过拿到对象引用的地址(9998#==this),去调用showValue()方法
             */
            student.showValue();
    
            /**
             * 直接调用 静态区 共享的 printlnCountry() 方法
             */
            Student.printlnCountry();
        }
    
    }

    执行结果:

    以上案例对应的内存图:

    1. 执行 java TestDemo   是给JVM发送指令,和JVM说:把这个 TestDemo.class 去执行;

    2.JVM就去执行 TestDemo.class 文件里面的字节码,首先第一步 是把 TestDemo.class字节码加载进内存;

    3.第二步,会把TestDemo 静态数据 分配到 静态区里面去;

    4.第三步,main方法进栈,是直接把静态区里面的 TestDemo --> main 方法拿过来进栈运行;

    5.第四步,new Student("张三", 89);

    6.第五步,注意:非常重要的点 要记住 ,那就是在 new Student("张三", 89); 的时候才把,Student.class加载进内存中的---> 存放区;

    7.第六步,分配Student静态数据到--->静态区;

    8.第七步,在堆内存中开辟 Student对象空间,并分配对象地址,并给变量赋初始值 null 0 等;

    9.第八步:构造方法Student(name, age) 进栈, 第九步:构造方法Student(name, age)弹栈;

    10.第十步,在堆内存中,name age 属性 被赋值完毕;

    11.第十一步,new Student(name, age); 后 得到一个对象引用地址 给student变量;

    12.第十二步,调用 student.showValue();

    13.第十三步:showValue()方法进栈, 并通过this去操作name、age属性,  第十四步:showValue()方法弹栈;

    14.第十五步:;

    15.第十六步:printlnCountry()方法进栈,并直接去访问 共享的 country 变量,  第十七步:printlnCountry()方法弹栈;

    16.第十八步:main方法执行完毕,弹栈;

     

    17.第十九步:等待 JVM GC 机制来回收 Student对象; 

  • 相关阅读:
    WRF WPS预处理
    CVS安装
    Linux窗口最小化消失,任务栏上无法找到的解决方法
    NCARG安装配置出现error while loading shared libraries: libg2c.so.0问题额解决办法
    Netcdf安装
    Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
    The leaflet package for online mapping in R(转)
    Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
    What does a Bayes factor feel like?(转)
    Weka算法介绍
  • 原文地址:https://www.cnblogs.com/android-deli/p/10351793.html
Copyright © 2011-2022 走看看