java的方法定义、数组定义、数组常用操作

来源:互联网 发布:高洛峰php百度网盘 编辑:程序博客网 时间:2024/05/26 05:53
方法、数组
方法:
格式:
修饰符 返回值类型 方法名(首单词首字母小写,第二个单词开始首字母大写)(数据类型1 参数名1,数据类型2 参数名2 ...){
方法中的语句体;
return ..;//有返回值类型的时候需要
}
调用方法推荐赋值调用,养成将方法返回值赋值给变量之后再使用返回值的好习惯。


注意:
方法不调用就不执行
方法与方法之间是平级关系,不能嵌套定义!
有返回值类型就必须return进行值的返回,而且参数类型要一致
方法定义的时候参数之间用逗号隔开
方法调用不用传递数据类型!比如sum(int 20,int 30);pluse(int a,int b)
同一个类中的方法名可以相同!方法名字相同而参数列表不同,在java中是根据方法名和参数列表来识别方法的,这个现象叫做方法的重载,另外要说明
一点,这个与返回值类型无关!
所谓参数列表不同指的是 参数数量不同或者参数类型不同都表示参数列表不同
比如如下方法
class Demo{
public static void main(String[] args){
sum(1,2);
sum(1,2,3);
}
public static int sum(int a,int b){}
public static int sum(int a,int b,int c){}
}
类中定义了2个同名方法sum,但是在实际调用中,会根据调用时传过去的参数个数来判别调用的是哪个方法


又比如如下方法中:
class Demo{
public static void main(String[] args){
sum(1,2);
sum(3.3f,2);
}
public static int sum(int a,int b){}
public static int sum(float a,int b){}
}
在调用的时候会根据参数类型的不同来选择相应的方法,第二行sum(3.3f,2)调用的是第二个方法


还有一种特殊情况,前面讲过不同数据类型进行计算或者赋值的时候,会按照数值范围的大小顺序进行转换比如 long l=2222,int类型的赋值给long的话,会将int转换为long
所以在方法调用的时候同样试用:
class Demo{
public static void main(String[] args){
sum(1,2);
sum(3.3f,2);
}
public static float sum(float a,int b){}
}
以上代码中只定义了一个sum(float a,int b){}的方法,但是在实际调用中传过去的参数类型如果是int或者long或者其他更小的范围的数据类型的数字仍然会调用
这个sum方法,当然如果类中已经定义了一个与调用的方法的方法名以及参数类型完全相同的方法的时候,那当然还是会调用那个方法,比如在上面的代码中再定义一个
public static int sum(int a,int b){}那么肯定还是调用这个方法


数组:
存储同一种数据类型的多个元素的集合
定义格式:
数据类型[] 数组名;
数据类型 数组名[];
数组要使用之前要进行初始化:
初始化:为数组分配内存空间,并为每个数组元素指定值
2种初始化方式:
动态初始化:初始化的时候制定数组长度,由系统指定数组初始值
数组类型[] 数组名=new 数据类型[数组长度]
数组长度其实就是数组中元素的个数,比如 int arr=new int[3];定义了一个长度为3的int类型的数组
 
静态初始化:初始化的时候指定初始值,由系统指定长度
int[] arr = new int[]{1,2,3};
int[] arr= {1,2,3}; 
上面的格式已经隐含了new了 


注意:
int[] arr = new int[3]{1,2,3}//这种方式是错误的!
int[] arr= new int[3];arr= null;System.out.println(arr);//会报空指针异常 NullException 因为数组变量指向了null,而不是指向堆中的数组空间了




java中的内存,java程序为了提高程序效率,就对内存中存储空间进行不同区域的分配,具体划分为了如下几块
栈 存放局部变量(局部变量:在方法定义中或者方法声音上的都叫做局部变量)
堆 存放所有new出来的东西
方法区
本地方法区 供系统使用,比如windows系统使用
寄存器 供cpu使用


在栈中存储的局部变量使用完即释放,所谓”用完“ 就是指变量脱离了它的作用域,比如 
public static sum(int a){
a...
}
如上代码,sum这个方法即为a所在的作用域,当sum方法执行完毕之后,变量a也随即释放掉


在堆中存储的变量使用完不会立即释放,使用完之后变成了垃圾,因为我们用完了不需要再用这些值/对象了,而这些值/对象又在内存中
占用了空间,所以我们称之为垃圾,那么这些垃圾会在垃圾回收器gc空闲时进行回收。


以 int[] arr=new int[3];为例
arr这个变量就是局部变量存放在栈中,new int[3]开辟了一段内存空间,创建了一个数组对象,存放在堆中
每一个new出来的东西都有一个地址值,这个地址值一般就是一个16进制的地址值
new一个数组的时候可以指定数组元素的数据类型这个类型可以是char byte short int long float double Array等(包括引用数据类型),
而每一种数据类型都有默认的初始值:
byte short int long :0
float double 0.0
char '\u0000'
boolean false
引用类型 null


对数组的常用操作
1.数组遍历
一次性输出数组中的每一个元素
借助for循环
for(int i=0;i<arr.length;i++){arr[i]}
arr.length是数组的一个属性,代表数组的长度,利用for循环进行遍历的话需要遍历到数组的长度-1的位置
2.获取数组的最值,即最大值或者最小值
int[] arr = {3,1,4,123,4,987,45}
取数组中的任意一个元素作为参照物,默认它已经是最大值
然后遍历其他元素,依次获取和参照物进行比较,并将较大的数保存到参照物中,遍历结束后参照物中的保留的值就是最大值
3.数组的逆序
定义一个方法用于将数组逆序
3.1定义方法要明确2点:返回值类型  参数列表
//注意这里不需要返回逆序后的数组!因为在方法中的参数是int[] arr,这个表示我们传过去的就是一个数组的地址!而地址就是指代的这个数组本身
//所以我们在方法中对数组进行逆序之后,原数组本身也已经改变了!
public static void reverseArray(int[] arr){
int temp;//用于交换数组元素
int length = arr.length;
for(int i=0;i<arr.length/2;i++){
a[i]=a[i]+a[length-1-i]=(arr[i]=arr[length-1-i])
}
}
4.数组的查找
查找给定的数据在数组中的索引位置
public static int getIndex(int[] arr,int value){
for(int i = 0;i<arr.length;i++){
if(arr[i]==value){
return i;
}
}
}
//以上代码编译会报错,提示没有返回值,如果数组中没有元素与给定元素相等的话那么就不会返回值
//所以代码应该改为如下形式
public static int getIndex(int[] arr,int value){
int index = -1;
for(int i = 0;i<arr.length;i++){
if(arr[i]==value){
index = i;
break;
}
}
return index;

}
0 0