Stack的java代码 java stacktrace( 三 )


)方法内部变量作为指令的操作数部分 跟在指令的操作码之后 保存在Stack中(实际上是简单类型保存在Stack中 对象类型在Stack中保存地址 在Heap 中保存值);上述的指令操作码和指令操作数构成了完整的Java 指令
)对象实例包括其属性值作为数据 保存在数据区Heap 中
非静态的对象属性作为对象实例的一部分保存在Heap 中 而对象实例必须通过Stack中保存的地址指针才能访问到 因此能否访问到对象实例以及它的非静态属性值完全取决于能否获得对象实例在Stack中的地址指针
非静态方法和静态方法的区别
非静态方法有一个和静态方法很重大的不同 非静态方法有一个隐含的传入参数 该参数是JVM给它的 和我们怎么写代码无关 这个隐含的参数就是对象实例在Stack中的地址指针 因此非静态方法(在Stack中的指令代码)总是可以找到自己的专用数据(在Heap 中的对象属性值) 当然非静态方法也必须获得该隐含参数 因此非静态方法在调用前 必须先new一个对象实例 获得Stack中的地址指针 否则JVM将无法将隐含参数传给非静态方法
静态方法无此隐含参数 因此也不需要new对象 只要class文件被ClassLoader load进入JVM的Stack 该静态方法即可被调用 当然此时静态方法是存取不到Heap 中的对象属性的
总结一下该过程 当一个class文件被ClassLoader load进入JVM后 方法指令保存在Stack中 此时Heap 区没有数据 然后程序技术器开始执行指令 如果是静态方法 直接依次执行指令代码 当然此时指令代码是不能访问Heap 数据区的;如果是非静态方法 由于隐含参数没有值 会报错 因此在非静态方法执行前 要先new对象 在Heap 中分配数据 并把Stack中的地址指针交给非静态方法 这样程序技术器依次执行指令 而指令代码此时能够访问到Heap 数据区了
静态属性和动态属性
前面提到对象实例以及动态属性都是保存在Heap 中的 而Heap 必须通过Stack中的地址指针才能够被指令(类的方法)访问到 因此可以推断出 静态属性是保存在Stack中的 而不同于动态属性保存在Heap 中 正因为都是在Stack中 而Stack中指令和数据都是定长的 因此很容易算出偏移量 也因此不管什么指令(类的方法) 都可以访问到类的静态属性 也正因为静态属性被保存在Stack中 所以具有了全局属性
lishixinzhi/Article/program/Java/hx/201311/26460
【Stack的java代码 java stacktrace】Stack的java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于java stacktrace、Stack的java代码的信息别忘了在本站进行查找喔 。

推荐阅读