数组
在java中,任何类型都可以定义成数组类型。例如我们之前学过int类型,int arr[] = new int[10];同时,如果我们学了对象,可以定义对象数组,例如,Person p[] = new Person[10],int类型的数组,它会自动初始化成0,boolean类型的数组会自动初始化成false。
//给数组赋值成0-9
int arr[] = new int[10];
for(int i = 0;i<10;i++){
a[i] = i;
}
值得注意的是,在数组中,是从0开始的,那么0开始,从后数第10个位置是9,所以这里最多到9
同样的,如果我们先对整个数组进行赋值,那么只需要使用length属性即可。
int arr[] = new int[10];
for(int i = 0;i<arr.length;i++){
arr[i] = i ;
}
如果你赋值的量比较少,那么你完全可以使用至今初始化的方法
int arr[] = {1,2,3};
//循环打印
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
函数
如果我们有大量需要复用的代码块,那么我们可以将它封装到一起,在java中可以定义一个函数,例如,我想输出1-100内的素数
public static boolean isPrime(int i ){
if(i<= 1){
return false;
}
for(int q = 2 ;q<=Math.sqrt(i);q++){
if(i%q == 0) return false;
}
return true;
}
public static void main(String args[]){
for(int i = 1;i<= 100;i++){
if(isPrime(i)){
System.out.println(i);
}
}
}
这样,如果我们写着写着,发现又要判断素数了,这时候,只需要调用isPrime()函数即可,而不需要再将isPrime()中的内容写一遍了。
函数与数组联系
与上面的数组联系,如果我们想将这个数组的元素都初始化成1,那么,我们也可以单独定义一个函数
public staitc void init(int arr[]){
for(int i = 0;i<arr.length;i++){
arr[i] = 1;
}
}
这样,我们以后没生成一个数组,就只需将数组传到这个函数来执行即可,例如
int arr[] = new int[200];
init(arr);
函数与基本类型联系
上面初始化了数组,那么我们想初始化基础数据类型的变量可以这样做吗,也放到一个函数中去初始化。
public static void main(String[] args) {
int a = 0;
init(a);
}
public static void init(int i ){
i = 2;
}
如果我们也希望像数组那样初始化,看看上面这张写法可行吗?答案是不行的,上面的这种写法,并不能改变a的值,原因是,这里的a变量是基本数据类型,它放在栈中,我们无法去直接修改栈中的值,我们知道,栈是后进先出的,这里这是将a的值赋传给了init中的i,也就是实参传给了形参,只是拷贝了一份而已,我们在inti函数中,无论怎么操作,都是操作的i的内容,而非a的内容。
引用传递和值传递
上面的两个例子,分别是引用传递和值传递的最好的说明了,数组放在堆中,我们可以通过引用直接修改堆中数据,而基本数据类型保存在栈中,我们知道栈是后进先出的,我们无法直接修改栈中的内容,jvm也不会允许这么做。
如果你学了C语言或C++,你可以理解成C中的指针,也可以理解成C++中的引用。后面会讲到对象,事实上,对象的传递也是引用传递,我们完全可以将这个对象放到另一个函数中去初始化。