Java中的方法类似于C语言中函数的概念,但是较之C语言的函数,Java中的方法对于返回值与形式的要求要更为严格,且Java方法支持重载。
1,方法的定义
修饰符 返回值类型 方法名(形参,形参){ 方法体代码; return 返回值; } //如: public static int add(int x, int y) { return x+y; }
如上,其中public static 为访问修饰限定符,int add(int x, int y)与C语言概念相同。
注意事项:
1,修饰符:现阶段直接使用 public static 固定搭配
2,返回值类型:如果方法有返回值,返回值类型必须和返回的实体类型一致,如果没有返回值,则必须写成void
3,方法名字:采用小驼峰命名
4,参数列表::如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5,在Java中没有方法声明一说,且方法不能嵌套定义,方法必须写在类中。
方法调用执行过程:
程序在调用方法时,系统会为其开辟新的空间,在调用结束后,系统会将该空间释放。--方法栈帧
Java中实参与形参的关系:
在Java语言中没有指针的概念,也不能对变量进行取地址操作。
所以,在Java中,形参永远是实参的临时拷贝,实参与形参是由两个独立的空间单独存放的不同的个体。
2,方法重载
为什么需要方法重载:
在实际开发过程中,我们可能会出现多种不同类型的同质需求,如int类型的加法函数与double类型的加法函数,其实现逻辑一致,只是类型不同,如下:
当我们出现了多个同质不同类型的需求是,此时我们为了区分,一般会将其命名为:intAdd,doubleAdd,floatAdd....等等一系列的名字,这对我们在开发时来说无疑是繁琐的。那么是否能将所有函数都命名为add呢?
方法重载概念:
在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合不同的场景去使用。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了,如下:
创建一个方法并使其重载:
方法重载必须满足以下条件:
1,方法名必须相同
2,参数列表必须不同(参数的个数、类型、次序)
3,方法重载与返回值类型无关
方法重载知识点补充:
在我们需要创建方法时,若是需要对一组数据进行操作,我们可能会传递数组。
在我们需要对一组数据进行相加操作时,可以创建方法,将该数组传递给方法:
上图中的函数可以使用如下代替,这两种写法代表的是一个意思:
其中... 叫做可变参数。
3,方法签名
在同一个作用域中不能定义两个名称相同的变量名,那么为什么类中可以定义两个方法名相同的方法呢?其主要实现依靠于方法签名。
方法签名:修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
4,数组的定义
数组是相同类型元素的一个集合,在内存中是以一段连续的内存空间。
在Java语言中,数组是一个引用数据类型,这就意味着其数组本身是存储的是所指向对象的地址,实际上数据是存储在数组对象中的。这很重要!
3,数组的创建及其初始化
在Java语言中,数组有两种常见的初始化方式:
- 动态初始化(指定长度)
- 静态初始化(指定内容)
(1)动态初始化(指定长度)
创建方式:
1))常规创建
//推荐 int[] array = new int[10]; //C语言写法,可以运行,但不推荐,仅作了解 int array [] = new int[10];
2))使用变量指定长度
除了上述两种创建方式外,还可以使用变量来指定数组长度,但要注意的是,数组有定长特性,一旦指定便无法再更改!,示例如下
可以使用变量来指定数组大小,但是当数组创建后,数组大小便固定,无法再进行修改
int n = 2; int[] array = new int[n];
3))拆分创建
动态初始化可以将其创建与指定长度分为两个步骤来写,如下:
即是先创建一个数组引用,再给该引用引用一个数组对象
int[] array; array = new int[10];
注意:以上new + (类型)int[10](大小),可以理解为在堆区创建一个数组对象,并将该数组对象的地址交由数组名保存。后续该数组即可通过地址访问到数组对象内存储的数据。
(2)静态初始化(指定内容)
创建方式
1))常规创建
//常规方式 int[] array = new int[]{1,2,3,4,5}; //同理,此类方式可以将创建于指定内容拆分来写,如下: int[] array; array = new int[]{1,2,3,4,5};
2))简便创建
注意:简便创建无法拆分!
int[] array = {1,2,3,4,5}; //此种方式创建与常规创建无区别,但是需要注意的是,此种方式不可拆分!
注意事项:
1,将数组赋值给数组,意为改变数组指向的对象。
2,仅有引用类型才能指向对象,并且一个引用类型仅能指向一个对象。
3,数组变量为引用变量,其存储的是所指向对象的地址,当我们创建一个数组变量但不对其开辟空间和初始化时,应当将该数组变量置为null(小写,null代表空引用,也就是不指向一个对象的引用)。
4,当我们开辟数组并对其指定空间却未对其初始化时,编译器会将元素初始化为默认值:
当数组中储存的元素类型为基本数据类型时:
当数组中储存的元素类型为引用类型时,默认值为null。
5,数组的访问
(1)数组元素的访问
与C语言一致,使用下标访问数组元素。
但是在Java语言中新增了接口 数组名.length:
数组名.length == 数组元素个数。
需要注意的是:
求数组长度是,用法为 array.length;
求字符串长度,用法为 string.length();
(2)遍历数组
在java中除去常规的for、while循环遍历数组外,还提供了一种增强for循环——for-each遍历数组。
for-each循环
for-each循环格式:
//支持嵌套 for(与数组元素同类型的变量:数组名) { //循环体 }
for-each遍历数组:
for-each循环较之for循环遍历数组,省去了循环条件的编写,适合直接对数组进行遍历。但是正是由于无循环条件,导致若是需要在循环体内写入判断条件会比较复杂。
6,数组的应用场景
1,作为函数的参数
数组作为一个引用类型,传参就是传递其所指向的对象地址。
正因为是传所储存的对象地址,故在函数中,只能对同一片空间内部进行修改。类似一级指针传参,可以修改所指向地址内的值,而无法修改一级指针变量本身。
2,作为函数的返回值
在Java中,函数可直接返回数组。
7,数组部分接口(API)介绍
Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法,下文将介绍部分接口。
(1)数组转字符串 .toString
接口使用格式:
import java.util.Arrays; public class Main{ public static void main(String[] args) { //返回值为字符串,故可直接打印 Arrays.toString(数组名); } }
使用示例:
(2)数组拷贝 .copyOf
接口使用格式:
import java.util.Arrays; public class Main{ public static void main(String[] args) { int[] array = new int[]{1,2,3,4,5}; //调用刚接口后,会返回拷贝后的数组,故需要使用数组接收。 int[] copy = Arrays.copyOf(待拷贝的目标数组,拷贝的长度); } }
使用示例:
(1)正常用法
(2)特殊用法:将其长度写成本身长度*n,再用本身接收,即是实现n倍扩容
(2)' 接口扩展(拷贝某个范围).copyOfRange
注意:在Java中,涉及到范围都是 左闭右开区间 表示,如下示例拷贝0~3范围的元素,结果为1,2,3。
接口使用格式:
import java.util.Arrays; public class Main{ public static void main(String[] args) { int[] array = new int[]{1,2,3,4,5}; //调用刚接口后,会返回拷贝后的数组,故需要使用数组接收。 int[] copy = Arrays.copyOfRange(待拷贝的目标数组,起始下标,终止下标); } }
使用示例:
(3)数组填充 .fill
接口使用格式:
import java.util.Arrays; public class Main{ public static void main(String[] args) { int[] array = new int[10]; Arrays.fill(待填充数组,待填充元素); } }
使用示例:
(1)正常用法
(2)指定范围填充
使用格式:
Arrays.fill(待填充数组,起始下标,终止下标,待填充元素);
(4)数组排序 .sort
接口使用格式:
import java.util.Arrays; public class Main{ public static void main(String[] args) { int[] array = {1,4,7,8,3,9,2}; //调用即可完成排序,默认升序 Arrays.sort(array); } }
使用示例:
8,二维数组
(1)创建二维数组
创建方式如下:
//指定内容 int[][] array = new int[][]{{1,2,3},{2,3,4}}; //省略 int[][] array = {{1,2,3},{2,3,4}}; //指定长度 int[][] = new int[3][5]; //不规则的二维数组 //仅定义行 int[][] = new int[3][];
(2)不规则的二维数组
不规则的二维数组创建方式:仅指定行,不指定列。
int[][] = new int[3][];
之所以称之为不规则的二维数组,是因为在Java语言中,数组是引用类型变量,其存储的是所指向的数组对象的地址。
而二维数组的每个元素都是一维数组,也就是说,二维数组每个元素存储的都是一个数组对象的地址。当我们只指定行数未指定列数时,数组没有开辟空间,其每个元素存储的都是null。
但是我们可以分别对二维数组的元素开辟一维数组,并且长度可以不同,这就是不规则的二维数组。
图示如下:
可以看到,所创建的二维数组每个元素的长度可以不相同。
(2)遍历二维数组
遍历打印方式:
(1)for循环遍历
(2)使用 .deepToString 接口
(3)使用for-each循环遍历