Student实体类里面有int、String等变量,创建1000个该对象程序运行所占用内存肯定也变大。如果在该类里面声明一个方法,内存是否也会随着对象创建数目变大而变大(抛开变量的因素)?如果将该方法声明为static呢?
public class Student {
public String name;
public int age;
public String address;
public int level;
public String remark;
public String getMsg() {
if (age > 0) {
if (level > 0) {
return "abc" + address;
} else {
return "bcd" + remark;
}
} else {
if (level > 0) {
return "we" + remark;
} else {
return "ewt" + address;
}
}
}
}
感觉楼上Tiger_Zhao 的回答还不错,其他的回答的有点不沾边啊
是这样的,
Student实体类里面有int、String等变量,创建1000个该对象程序运行所占用内存肯定也变大。 这句是对的,
首先第一点:内存的大小受服务器配置影响,服务器确定,内存大小是确定不变的!
第二点:对于创建对象,从这个对象被创建,生命周期开始,到这个对象没用,生命周期结束,生命周期一旦结束,就是"垃圾",gc系统会在内存不够的时候,自动回收这些垃圾,从而释放资源,
第三点:如果是静态的,则会一直被加载在内存中,不会被释放,如果静态的方法,变量,类太多,则可能会导致内存溢出.
第四点:如果对于流(各种流),管道(各种管道),如果在操作完成之后,不进行关闭,则会导致这个管道被占用的内存不被释放.gc无法回收,假如内存为5个量,管道占用1个量,如果没有关闭下次再用只有4个量,在没有关闭,只有3个量,如此类推,内容总会被用完,此为内存泄漏,所以对于io操作,需要关闭流
说的问题,应该是从这个对象开始被创建,生命周期开始
java(不是javascript)其实和C++、VB等一样,都是先编译、再执行的。
方法getMsg()编译后的可执行代码只有1块。
如果创建了两个对象s1、s2,它们内部的“方法表”中都会记下指向可执行代码块的“函数指针”;
至于如何让函数调用的时候能够访问对应对象的成员,其实就是调用时,把 s1 或 s2 作为 this。
你可以简单理解为,方式会自动加上一个参数,按照 getMsg(this) 的定义编译/执行。
静态方法,区别就是不加这个参数,所以和对象实例无关的。
回到内存大小的问题上,无论方法有多复杂(可执行代码块有多大),添加方法只增加保存“函数指针”所需,很小。
方法多关系不大吧,因为方法是要调用才起作用的啊,只有对象被创建了才会占用内存;只是static的是程序被加载的时候就创建了;