基于Java 数组内存分配的相关问题
发布时间:2020-12-14 14:12:34 所属栏目:Java 来源:网络整理
导读:可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题。 呵呵。突然就发现许多书上 “基本数据类型存储在栈内存当中,对象则保存在堆内存” 这句话完全是错误的。下面是个简单的例子代码: 复制代码 代码如下: public class Test { publi
可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题。 复制代码 代码如下: public class Test { public static void main(String[] argv) { // 静态初始化数组 String[] names = { "Michael","Orson","Andrew" }; // 动态初始化数组 String[] animal = new String[4]; // 让animal 指向 namens 数组所引用的数组 names = animal; System.out.println(names.length); “Java 数组大小是不能改变的”这可能大家都听过,那上面这段代码就有问题了,animal [] 长度为4,而names [] 数组的长度只有3,但是经过一个赋值语句,两个数组的大小就都变为4了。这不是改变了数组的大小吗? 问题就这样挡在面前了!好吧,问问技术前辈吧,就这样对数组的存储方式有了全新的认识。下面是我的一点理解:(如果有错误的,刚好被大神你看到了,也请你能够指出来。) 上面的的 names 和 animal 不代表这个数组对象,而仅仅是数组的变量而已,和C里面的指针是一样的,这样的变量叫做引用变量。数组对象是保存在堆内存当中,大小当然是不能改变的,但是数组变量却能够指向其他的数组对象,可以看看下面这个图: 复制代码 代码如下: public class Animal { private String name; private int age;Animal(String name,int age) { this.name = name; this.age = age; }public void info() { System.out.println(name + " " + age); } } public class Test { public static void main(String[] argv) { // 动态初始化数组 Animal[] animal = new Animal[2]; Animal cat = new Animal("cat",1); Animal dog = new Animal("dog",2); animal[0] = dog; animal[1] = cat;// 当数组变量引用对象的方法(或者属性)的时候,它就变为实际的Java 对象 System.out.println(animal.length); //dog 这个原本存储在栈内存当中的对象引用通过调用对象的方法变为实际的对象 dog.info(); animal[0].info(); } } 只有当栈内存中的引用变量调用了对象的方法或者是指向了对象的属性的时候,它就从变量真正成了对象了。(比如上面例子中的 cat,dog 对象引用变量,animal[]数组变量)。 通过animal[0] = dog; animal[1] = cat; 使得两个变量都指向了存储在堆内存当中的对象,所以他们俩个打印出来的信息是一模一样的. animal[1] = cat; 之前的变量指向的状态,红虚线是赋值语句之后的状态,animal[0]和dog,animal[1] 和cat 所指向的都是相同的堆内存空间。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- JAVA课后问题汇总(第四次课)
- Java中的XMLSignature中的DigestValue与C#不同
- 详解spring-boot actuator(监控)配置和使用
- 在混合代码项目中有没有理由在groovyc上使用java
- Spring boot工具类静态属性注入及多环境配置详解
- symfony – 如何结合DoctrineExtensions中的Tran
- java – 安装JDK时出错
- java-mybaits-012-mybatis-Interceptor-拦截器读
- java – 防止来自outofmemory Exception的Concur
- java – 具有自动高度的多行JTable单元 – 超大的
热点阅读