A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 无此姓名 于 2014-3-8 15:39 编辑
  1. class Person
  2. {
  3.         static public void show()
  4.         {
  5.                 System.out.println(name+".."+country);
  6.                 speak();//编译会不通过。 因为静态不能调用非静态
  7.         }
  8.         public speak()
  9.         {
  10.                 System.out.println("unstatic");
  11.         }
  12. }
复制代码


我们都知道,静态方法不能访问非静态方法。因为静态成员和方法随着类的加载而加载,会先于对象存在。
问题是:
那非静态方法什么时候加载呢?建立对象之后才存在吗?那存在于哪里呢?方法区吗?
如果存在于方法区,具体存储方式和静态方法有什么区别呢?
如果大神能以图形的形式展现出来最好了

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 zzmxhm 于 2014-3-8 18:27 编辑

在第一次访问某个类时,虚拟机就会将该类对应的字节码文件加载进内存中某个区域,字节码文件就包含了类中成员方法的定义,所以就存储而言,它们是没有区别的。区别在于我们需要通过对象去调用非静态方法,而静态方法只需要通过类型去调用。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
zzmxhm 发表于 2014-3-8 18:24
在第一次访问某个类时,虚拟机就会将该类对应的字节码文件加载进内存中某个区域,字节码文件就包含了类中成 ...

你说的不是编译的过程吗!!对象建立之前,静态和非静态的方法就加载了吗?应该不是吧。如果同时加载,那为什么静态方法不能调用非静态的呢?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
静态方法 在类定义的时候就给分配内存 可以直接用类名直接调用   非静态方法最有在定义对象的时候才分配内存、 也就是说 静态的比非静态的生存周期长。     我们可以不定义对象直接调用静态方法。如果 静态中定义非静态 那么没有对象的时候非静态就不会分配空间。所以会报错!

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
非静态方法,也可以称为实例方法,都有一个implit parameter  this, 在一个对象没有完成内存的分配之前,是无法得到this的值的。
而static方法,得不涉及到this,也就无法访问实例变量

关于这方面的讲解在 深入理解对象模型 的书中有讲解

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
冯鸿昌 发表于 2014-3-9 20:33
非静态方法,也可以称为实例方法,都有一个implit parameter  this, 在一个对象没有完成内存的分配之前,是 ...

谢谢谢谢:lol
回复 使用道具 举报
Monkey·D·Chas 发表于 2014-3-8 22:14
静态方法 在类定义的时候就给分配内存 可以直接用类名直接调用   非静态方法最有在定义对象的时候才分配内 ...

谢谢你的认真回答
回复 使用道具 举报
水蓝 中级黑马 2014-3-13 16:54:53
8#
类的第一次实例化,你的理解,大体上是正确的。
在虚拟机运行是的数据区域中,有如下区域:
1、程序计数器
2、虚拟机栈
3、本地方法栈
4、方法区(包裹常量池)
5、堆
其中:
1、2、3是线程私有的区域,每一个线程都有一份。
4、5是虚拟机中,线程公有的,所有线程共享。

对象:是存储在堆区中的。
类、方法、静态、常量:都是存在方法区中的。
程序计数器:是用来控制执行的,你可以简单理解为用于记录程序执行到了多少行。按照代码的流程走。
本地方法栈:说白了就是,JAVA虚拟机调用外部资源的接口,因为JAVA本身也要依赖操作系统的接口,来操作程序的外部资源。比如:文件的读写、数据库、网络访问等。
至于虚拟机栈:可简单理解为局部变量的存储空间。同时也记录了程序运行的栈帧位置。

(to版主,之前把这回复误写到.net的一个相似问题里面去了,反正先回答着呗)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马