• 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对象; 

  • 相关阅读:
    poj 3273 Monthly Expense(贪心+二分)
    codeforces 235 div2 C Team
    ZOJ 3607 Lazier Salesgirl(贪心)
    poj 1185 炮兵阵地(三维状态压缩dP)
    poj 2411 Mondriaan's Dream(状态压缩dP)
    sdut 2819 比赛排名(边表 拓扑排序)
    hdu 1421 搬寝室(dp)
    hdu 1243 反恐训练营(dp 最大公共子序列变形)
    Codeforces Round #232 (Div. 2) B. On Corruption and Numbers
    hdu 1559 最大子矩阵 (简单dp)
  • 原文地址:https://www.cnblogs.com/android-deli/p/10351793.html
Copyright © 2020-2023  润新知