面向对象03
引用类型数组
-
声明
String[] str = new String[]{}; //与普通类型数组类似 引用类型[] 数组名 new 引用类型数组
-
赋值
str = new String[10]; for (int i = 0; i < str.length; i++) { str[i] = new String(""+i); } //需要注意的是,引用类型数组每个元素都是引用类型,赋值时需要单独new个对象存进去
-
访问
System.out.println(str[0].charAt(0)); System.out.println(str[1].length()); //每个元素都是单独的对象,访问对象属性(和方法)通过对象名打点来访问
内存补充:
Java运行不是直接在内存条中运行,而是通过Java虚拟机(Jvm)管理。
在Jvm中,大致分为三个区域,栈,堆,方法区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbwOR29H-1660976196078)(C:\Users\tarena\Desktop\ass\李柯辰作业.png)]
- 所有方法,静态变量都存在方法区中(主方法也是方法),当加载一个类时(如new一个对象),先将其中的方法(构造方法)和静态变量加载。
- 堆中存放对象(数组)和属于它的成员变量(数组元素)。
- 栈中存放局部变量和方法的参数。
对象名也是局部变量(引用类型变量)存放在栈中,指向的是地址,通过变量名访问对象即通过地址指向堆中的实例。
基本类型变量存放的是值,直接放在栈中,使用时就是直接使用它代表的值。
引用类型数组的创建:
数组本身被看做是对象,数组名存放在栈中,存的是地址,指向的是堆中的数组对象,在没有赋值时,数组对象中的元素没有指向,即为null。在此时对数组元素进行操作就会报空指针异常。
赋值后,数组元素存放的是地址,指向的是堆中对应的实例对象。
对数组元素的访问,即为通过其存放的地址指向对应的实例。
Java中都是值传递:
-
基本类型的传递即为本身代表的值的副本的传递。
-
引用类型的传递即为本身对应的对象的的地址副本的传递。
注:方法的传参也是同理。
int a = 5;
int b = a;
b = 8;
System.out.println(a);//5
//在栈中a为5,b为a传递的值5,对b重新赋值,a结果并不会改变
class Test{
int a;
}
Test test01 = new Test();
System.out.println(test01.a);//0,默认值
Test test02 = test01;
test02.a = 10;
System.out.println(test01.a);//10
//在栈中test01存放的地址指向Test对象,此时访问这个对象的属性a
//因为没有赋值,所以为0。然后把test01赋值给test02,首先没有new关键字,可以确定并没有创建新的对象,赋值就是把栈里面test01中存放的地址赋值给test02,对test02的属性a赋值为10,即为改变其地址所指向对象的属性a,那么再访问test01时,同样的地址指向同一个对象,属性a已被赋值为10
的属性a赋值为10,即为改变其地址所指向对象的属性a,那么再访问test01时,同样的地址指向同一个对象,属性a已被赋值为10