数组
- 一维数组:
(1)定义:int a[ ]; 或 int[ ] a;
(2)初始化:
public class Demo1{
public static void main(String[] args){
//省略格式的静态初始化
int[] array1 = {10,20,30};
//静态初始化的标准格式,可拆分为两步
int[] array2;
array2 = new int[] {11,21,31};
//动态初始化的标准格式,可拆分为两步
int[] array3;
array3 = new int[5];
/*
需要注意的是静态初始化如果使用省略格式,一定不能分为两步
int[] array4;
array4 = {10,20,30}//报错
*/
}
}
.
(3)引用:a[0],脚标取值范围为0 ~ a.length-1
(4)每个数组的长度 :a.length
- 多维数组: 定义:int [ ][ ] ii=new int[2][3]; 或 int [ ][ ] iii=new int [2][ ]; 或 int [ ][ ] iiii=new int [ ][ ]{{1,2},{3,4}};
- 混合定义数组: int [ ] x,y[ ];(x为一维数组,y为二维数组)
- 在JVM内存中,堆(Heap)存放数组的数据,栈(Stack)中存放数组的数据在堆中的地址值
方法(函数)
1.方法的参数:
(1)可以构造确定地参数个数,如:public void setName (String name){ this.name = name }
(2)可以构造可变的参数个数,
方法一:用数组的方式传递可变参数;如果没有参数,就要定义一个空数组或null,如:public void print (String[ ] args ){...}
方法二:用Java特有的方法(…)用来传递可变个数的参数;如果没有参数可以不填,如:public void print (String... args){...}
2.方法的参数传递:Java中只有值传递,值是变量在栈中的值。
JVM内存模型:
因为基本数据类型都是保存在栈中,而引用类型数据及对象都是在栈中保存的是他们的地址值,在堆中保存的才是实际数据;所以会存在形参是基本数据类型还是对象的两种不全相同的情况。
(1)如果方法的形参是基本数据类型,那么实参(也就是实际的数据)向形参传递参数时,是把实参的值复制给形参,即值传递。所以一个方法不能够修改一个基本数据类型的参数(即数值型或布尔型)。
(2) 如果方法的形参是对象,那么实参(实际的对象)向形参传递时,是把实参在栈中的地址值,也就是引用对象在堆中的地址。所以一个方法可以改变一个对象参数的状态(即可以通过地址值改变数据),但是不能让实参对象更换引用(即地址值)。
具体图示分析如下:
3.方法类型:
(1)无参数无返回值
public void Demo1(){
System.out.println("无参数无返回值");
}
(2)有参数无返回值
public void Demo2(int a,String b){
System.out.println(a+"-->"+b);
}
(3)有返回值无参数
public void Demo3(){
System.out.println("有返回值无参数");
return true;
}
(4)有返回值有参数
public void Demo4(int a,int b){
return a*b;
}
(5)return也可以用来结束方法
public void Demo5(int a){
if(a>10){
return ;
}
System.out.println(a);
}
另外也可以用System.exit(0)将整个虚拟机里的内容都停掉了 ,直接结束整个运行环境。
JVM内存模型
上述两点都用到了一些JVM内存模型的知识,所以就系统整理了一些JVM内存模型的知识。
1.虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack )用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。Java 虚拟机栈也是线程私有的,生命周期与线程相同。
局部变量表存放了编译期可知的各种基本数据类型、对象引用(一般指的是位置信息,可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址)。
2.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例(实际数据),几乎所有的对象实例都在这里分配内存。