所谓"类不占用内存空间,其生成的对象才占用内存空间"主要指编译层面的说法还是运行层面的说法?意思是这个内存是以产生代码得其说还是以代码调到内存运行时得其说?多谢赐教!
解决方案 »
- 分别用do-while和for循环计算1+1/2!+1/3!+……的前20项和
- 我的一个JSP系统在重装环境后无法显示,请高手帮忙
- java.lang.NumberFormatException: multiple points。请问这个问题怎么解决?
- Java随机数问题,高手都来帮忙
- java调用本地程序的问题
- 提问:SWT的的composite为什么无法滚动?
- 有没有类似Properties的类可以从Reader中读数据
- applet中实现鼠标事件的编程
- jar包打好了,怎样使用呢?
- ##### java 哪种界面控件可以接收 tab按键消息? #####
- JTextArea的getText()方法为什么得不到,文本框中的内容?是不是必须用setText()才行?
- Java中碰到的有趣问题
2.以代码调到内存运行时得其说
幕后为我们做的。
详细请参考《java虚拟机》 了解虚拟机还是很不错的。
呵呵
对象有对象的布局区,类也有类的布局区。
我是这样理解的,不知对否
//Data.java
public class Data {
private static int i = 1;
public Data () {
System.out.println("creat:" + i);
i++;
}
}
//Data2.java
public class Data2 {
public Data2 () {
System.out.println("creat Data2;");
}
}//Text.java
import java.io.*;
public class Text {
private static BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
Data first = new Data();
System.out.println("first");
String a = stdIn.readLine(); // 运行到这一行是将磁盘中的文件删掉 程序仍继续运行
Data secend = new Data(); //运行
Data2 third = new Data2(); // 此处发生错误 NoClassDefFoundError 说明前面每用到的类
// 没有装载到内存中 }
}
也就是说类的信息在内存中,其中的方法在方法区中。
当用到使才装载。
调用A.class,来用做以后的类的编译也和 A.java 没关系了, 所以说,A.class不是类~ 是模板。
当某个类的对象被创建时,因为Java的对象都是动态产生的,所以,在程序的堆区里为这个对象分配空间,
同样的,对象空间中也仅仅存放成员变量,和方法无关。
对于OOP编译出来的都是类,而此问题是指对类及其引用对象的操作,所以,当然应该是运行层面的。
而老一些的面向结构的编程编译出来的是应用程序,便不会产生这个问题了,但变量在内存中的使用分配问题依然是以运行层面的。
C++中,一个对象一旦声明,就意味着创建了它,会在内存中分配空间给它;
Java中,声明一个对象并不意味着创建,只有当你使用 new+构造方法 才会创建它,为它分配空间。
C++中,一个对象一旦产生,就会存在到它所在的函数调用结束,如果它是在main函数里声明的,那就是存在到程序运行结束;
Java中,一个对象产生之后,如果它从某条语句以后不再用到,那么Java的垃圾处理器会自动删除它。
现在就是说,java类 和 该类生成的对象 之间,哪个占用内存? 小弟认为:类是虚拟的一个概念,对象才是现实的程序中调用的,要占用物理内存的。至于,类在java里怎么动态加载,是jvm的工作。可能是在.class里有类的编译后的调用代码,只要你在程序里要调用该类的对象,那么这个时候,类是不占用内存,占用物理内存的 应该是该类的对象.
我是这么认为的.不要笑话我....
还有你说的编译后的程序(即.exe或.class等文件)并非真实的变量和函数调用关系的存储空间布局,而只是一些描述这些布局的指令串是吧,都是这样吗,是编译大致都是采用这样的方法吗? 另想问的是com组件是类还是对象?
看我在11楼的回应是否说的有点道理?
整个程序的运行。程序的逻辑结构、逻辑顺序等性质,包括变量和函数等概念,在可执行的机器代码里,并不存在严格的对应物。“另想问的是com组件是类还是对象?”
com组件是对象。
二、com组件根据我所查阅的资料结合我本人的理解它应该是类,是一种基于二进制代码的可重复使用的类模块,诸如Windows环境中的各类控件实际应该是一种类,比如按钮、文本框等是可以作为一种类摸板提供编程的。com组件好象可以对应java的bean组件。我是这么理解的,请你说说你的看法。