方法:
在Java语言中“方法”等价于“函数”
什么是方法?
一段可重复使用的代码段;
程序中完成独立功能的一段代码的集合(方法用于实现独立的功能)。
方法定义:
[修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……])
{
执行语句; [return 返回值;]
}
形参: 定义在方法申明上的用来接收外界传入值的变量;
实参: 调用某一个方法的时候,实际传入的值;
参数列表: 参数类型,参数个数,参数顺序
方法签名: 方法名 + 参数列表
返回值:方法在执行完毕后返还给调用它的环境的数据。
返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回类型 void。
return 语句:终止方法的运行并指定要返回的数据
方法只有被调用才能执行;
调用方法:[类/对象.]方法名(实参); 例如 int ret =sum(1,3);
实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配
方法的特点:
它可以实现独立的功能;
必须定义在类里面;
它只有被调用才会执行;
它可以被重复使用;
方法结束后方法里的对象失去引用;
如何定义一个功能,并通过方法体现出来:
明确该功能运算后的结果.明确返回值类型;
明确在实现该功能过程中是否有未知内容参与运算,确定参数列表;
定义方法,其实就是定义一个完成独立功能的代码块;
是否需要返回值: 调用者需要该方法执行后的结果;
传入什么参数: 完成该功能需要多少和哪些未知的元素
调用方法时的参数传递:
调用方法时的参数传递其实就是在给方法里的变量赋值;
程序无非就是不断的在实现功能。
功能都是以方法的形式来体现的。
书写时:为了增强阅读性,方法中的代码尽量不要超过二十行。
如果一个功能实现代码过多,可以在将其中的部分代码再次封装成另一个方法。
局部变量的初始化和内存中的运行机制:
局部变量必须先初始化再使用,这里的初始化其实就是在为其分配内存;
局部变量总是保存在其所在方法的栈内存里面,若:
基本类型:变量的值直接保存在变量的内存中;
引用类型:存放该变量实际引用对象或数组的地址;
栈里面的变量无须系统去垃圾回收,栈内存的变量会随着方法或代码块的运行结束而结束;
编程规范说明:
方法名不能使用关键字和保留字;
回忆类名的定义规范:
单词的首字母大写,采用驼峰式;
由有实际意义的名词或名词短语构成:
如:Student, StudentScore,
方法名规范:
第一个单词的首字母小写,采用驼峰式;
由有实际意义的动词或动词短语:
如:playGame,grow
方法重载(Overload):
概念:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型或参数顺序不同即可。
存在的原因:
屏蔽了一个对象的同一类方法由于参数不同所造成的差异。
特点:
与返回值类型无关,只看参数列表。
法则:两同,一不同:
两同:在同一个类中,方法名相同;
一不同: 参数列表不同
和返回值类型,修饰符都没关系;
数组:
用来装同一种数据类型的容器;
数组一旦初始化Ok ,长度就不可改变;
数组里的成员: 数组元素
数组里的元素,都有脚标/索引(index),方便操作。索引从0开始排;
使用Java数组:必须先声明数组,再给该数组分配内存;
一维数组申明:
数组类型[] 数组名;
一维数组:可以理解为一列多行、类型相同的数据,其中每个数据被称为数组元素;
数组必须初始化之后才能使用;
java语言声明数组的时候不能指定其长度(元素的个数),int a[5]; //非法
一维数组的初始化:
Java中的数组必先初始化才可以使用,所谓初始化就是为数组的数组元素分配内存,并为每个数组元素赋值。
静态初始化: 我们指定数组元素值,系统决定长度;
格式: 数组名 = new 数组类型[]{ 值1,值2....};
简单格式: 数组名 = { 值1,值2....};
动态初始化: 我们指定数组的长度,系统自动分配元素的初值(和成员变量默认的初始值相同)
格式: 数组名 = new 数组类型[int类型的长度值];
默认的初始值如下:
整数: 0
小数: 0.0
char: '\u0000'
boolean:false
引用类型: null
不能静态和动态初始化同时使用:
也就是说不能同时指定数组的长度和元素;
数组的长度一旦确定,就不能改变,也就数组是定长的;
访问(使用)数组:
Java语言的数组索引是从0开始的,也就是说数组里的第一个元素的索引是0,第二个元素的索引是1,依次可以类推。
常见操作:
给数组元素赋值
数组名[索引] = 数组类型的值 ;
访问数组元素
数组类型 变量 = 数组名[索引];
得到数组的长度
int len = 数组名.length; //length是数组的属性
遍历数组
数组元素的索引范围?
数组里的元素的脚标的区间:[0,数组长度-1]<--等价于-->[0,数组长度)
使用for循环操作数组元素
数组脚标越界异常(ArrayIndexOutOfBoundsException)
空引用异常(NullPointerException)//操作引用类型的时候
数组在内存中的分析:
内存的特点:
开辟不同内存空间是为了对每一片内存中的数据都有不同的处理方式,提高效率。
栈内存的特点:
存储局部变量,空间不用时自动释放内存。
堆内存的特点:
1、存储数组和对象,通过new关键字建立的实体都存放在堆内存当中。
2、实体都有一个内存地址值。
3、堆内存中的变量都有默认初始化值。
4、垃圾回收机制,Java特有的内存管理机制,在不定时的时间内将垃圾清除释放空间。
二维数组(数组中的数组):
二维数组(其实是一个一维数组,它的每一个元素又是一个一维数组),可以看做是一张表格
在数组中再存放数组,外层数组看做是行,内层数组看做列;
动态初始化
静态初始化
int[][] arr2 = new int[3][4];
3:表示最外层一维数组的长度(代表行);
4:表示这个3个一维数组的长度(代表列);
int[][] i3 = newint[][3];//不允许高维(行,左边)没分配空间而先给低维(列,右边)分配空间
二维数组的初始化:
动态初始化:
int[ ][ ] arr = newint[3][2];
定义了一个二维数组,其中有3个一维数组,每一个一维数组中有2个元素
静态初始化:
int[ ][ ] arr = newint[][]{{1,2},{3,4},{5,6}};
int[ ][ ] arr ={{1,2},{3,4},{5,6}};
操作二维数组:
获取二维数组的长度:arr.length
获取二维数组里第二个元素的长度:arr[1].length;
int[][] arr = {{3,1,5},{2,6},{8}};
元素值5的表示方式为:arr[0][2]= 5;
第二个一维数组的长度表示方式:intlen = arr[1].length;
对二维数组的遍历使用for的嵌套循环。
对于其他多维数组,几维就用几层for嵌套,但通常情况数组最多用到三维,因为效率已经大大降低了,也不方便于阅读。
//先获得二维数组第一个元素里每一个值
for(inti= 0; i<arr2[0].length; i ++)
{
inti = arr2[0][i];
}
//先获得二维数组第2个元素里每一个值
for(inti= 0; i<arr2[1].length; i ++)
{
inti = arr2[1][i];
}
//先获得二维数组第3个元素里每一个值
for(inti= 0; i<arr2[2].length; i ++)
{
inti = arr2[2][i];
}
///优化
for(intx = 0; x <= arr2.length-1; x++)
{
//x= 0 , 1, 2
for(inti= 0; i<arr2[x].length; i ++)
{
inti = arr2[x][i];
}
}
方法参数的传递机制:
Java的方法是不能独立存在的,调用方法必须使用类或对象。
Java方法的参数传递机制是什么呢?
引用传递 / 值传递:
参数进行传递时都会先在自己方法栈中生成一个实际参数的副本,然后该副本拥有实际参数的堆内存地址,使用结束后副本被释放,而实际参数本身不会受到任何影响;
方法参数的传递机制----基本类型参数:
方法参数的传递机制----引用类型参数:
操作数组的工具类-Arrays:
static int binarySearch(type[] a, type key) 使用二分搜索法来搜索key元素在数组中的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。
static int binarySearch(type[] a, int fromIndex, int toIndex, typekey) 使用二分搜索法来搜索key元素在数组中从fromIndex到toIndex的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。
static boolean[] copyOf(type[] original, int newLength) 复制指定的数组见下面备注
static byte[] copyOfRange(type[] original, int from, int to) 将数组的指定范围复制到一个新数组。
static boolean equals(type[] a, type[] a2) 如果两个数组长度相等和元素一一相等,则返回 true
static void fill(type[] a, type val) 将a数组所有元素都赋为val。
static void fill(type[] a, int fromIndex, int toIndex, type val) 将a数组从formIndex 到tiondex索引之间的元素都赋为val。
static void sort(type[] a) //sort(int[] arr)对指定的数组按数字升序进行排序。
static void sort(type[] a, int fromIndex, int toIndex) 对指定数组的从formIndex到tiondex索引之间的元素按数字升序进行排序。
static String toString(type[] a) 返回指定数组内容的字符串表示形式。多个数组元素之间用英文逗号或空格隔开。
操作数组的工具类-System:
使用java.lang.System类的静态方法
可以用于数组src从第srcPos项元素开始的length个元素拷贝到
目标数组dest从destPos开始的length个元素
public static void arraycopy(
Objectsrc,
intsrcPos,
Objectdest,
intdestPos,
intlength):
参数描述:
src- 源数组。
srcPos- 源数组中的起始位置。
dest- 目标数组。
destPos- 目标数据中的起始位置。
length- 要复制的数组元素的数量。
Java5新特性对数组的支持:
Java5开始:
方法的 可变参数形式
增强for循环 → for-each
方法的可变参数:
方法中可以接受的参数不再是固定个数的,而是随着具体需求传递的多少来决定。
定义格式:返回值类型 方法名(参数类型 ... 形式参数){}
可变参数的特点:
只能出现在参数列表的最后;
... 位于变量类型和变量名之间,前后有无空格都可以;
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数
调用带有可变参数的方法时,这个可变参数可以传入多个参数,也可以传入一个数组
增强for循环:
格式:
for(元素数据类型 变量名 :数组对象或集合对象){// 这里的集合对象说的不严格,应该是Iterable的实例
//……
}
public static void main(String[] args) {
String[]itcastNames={"bjitcast","cditcast","gzitcast"};
for(String name : itcastNames) {
System.out.print(name+ " ,");
}
}