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

原文地址:https://www.cnblogs.com/android-deli/p/10351793.html

时间: 2024-11-13 06:40:09

Android-Java-静态变量与静态方法&普通变量与普通方法(内存图 完整版)的相关文章

Java静态属性、静态方法、非静态属性、非静态方法的继承问题简单了解

package com.book.web.controller; /**  * 父类  * @author liweihan  *  */ public class Parent { public String normalStr = "父类非静态属性"; public static String staticStr = "父类静态属性"; public String changeStr = "父类-变量"; public static Stri

Android-普通变量与普通方法内存图

描述Worker对象: package android.java.oop11; // 描述Worker public class Worker { public String name; public int age; public void printlnNameAge() { System.out.println("name:" + this.name + " age:" + age); } } main测试方法: package android.java.oo

JniHelper调用java静态和非静态方法总结(即cocos2dx中调用android平台下显示第三方广告)

调用非静态方法首先就是调用的静态方法得到要调用的java的类对象然后通过调用minfo.env->CallVoidMethod(activityObj, minfo.methodID);方法把对象和要调用的方法以及参数(如果有 )传递个java类对象中的非静态方法: java类: // c++中調用的方法public static Object rtnActivity() {System.out.println("----------rtnActivity");return ma

Android kotlin静态属性、静态方法

只需要用 companion object 包裹相应代码块即可.以静态属性为例: class Constants { companion object { val BASE_URL = "http://192.168.x.x/decoration_axx_api/" }}12345调用 Constants.Companion.getBASE_URL()--------------------- 作者:灭谛 来源:CSDN 原文:https://blog.csdn.net/u010296

(转)Java静态变量,静态类,静态方法

静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                                        非静态对象     拥有属性:                是类共同拥有的                                             是类各对象独立拥有的内存分配:               内存空间上是固定的   

JAVA的静态变量、静态方法、静态类

JAVA的静态变量.静态方法.静态类 静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                                        非静态对象      拥有属性:                是类共同拥有的                                             是类各对象独立拥有的 内存分配:      

转载:JAVA的静态变量、静态方法、静态类

静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                                        非静态对象 拥有属性:                是类共同拥有的                                             是类各对象独立拥有的 内存分配:               内存空间上是固定的      

【转】JAVA的静态变量、静态方法、静态类

转自:http://blog.csdn.net/zhandoushi1982/article/details/8453522/ 静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                                        非静态对象     拥有属性:                是类共同拥有的                       

Java中的静态变量、静态方法、静态代码块

转载自http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html (一)静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法.要实现这样的效果,只需要在类中定义的方法前加上static关键字.例如: public static int maximum(int n1,int n2) 使用类的静态方法时,注意:a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的