kaindy7633/blog

Java基础之方法和数组

Opened this issue · 0 comments

方法

方法,也叫函数,它是完成特定功能的代码块。一个方法就是一个功能、一个动作或一种行为。

当一些代码被反复使用时,可以把它们提取出来,放到一个方法中,以方法的形式来使用这些代码,大大提高代码的复用性。

方法的格式如下:

修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2...) {
	// 方法体语句;
	return 返回值;
}

那么如何来定义一个方法呢?

  • 确定方法名
  • 确定返回值类型
  • 确定参数列表
public class MethodDemo {
	public static void main(String[] args) {

	}

	/**
		求两个整数和的方法
	*/
	public static sum(int a, int b) {
		// 方法体语句
		int c = a + b;
		return c;
	}
}

方法定义完成后就要调用它,直接通过方法名就可以调用方法,除此之外,还需要根据形式参数列表将实际参数传递给方法

  • 形式参数: 在定义方法时需要明确方法参数的形式,比如参数的类型和个数
  • 实际参数: 调用方法时传递给方法的数据,必须符合形式参数的个数和对应位置的数据类型
public class MethodDemo {
	public static void main(String[] args) {
		/**
			在main函数中调用方法
		*/
		int result = sum(10, 20);
		System.out.println(result);
	}

	/**
		求两个整数和的方法
	*/
	public static sum(int a, int b) {
		// 方法体语句
		int c = a + b;
		return c;
	}
}

方法定义需要注意以下几点要求:

  • 方法必须定义在类中
  • 方法之间是平级关系,不能嵌套
  • 如果方法没有返回值,其返回值类型必须写成void
  • 当方法返回值类型为void时,可以省略return语句
  • return语句后的数据类型必须和返回值类型匹配
  • return语句之后不能再放置其他语句

下面来看看在Java中非常重要的方法重载

方法重载是指在同一个类中的多个方法,它们的方法名相同,参数列表不同,且方法重载与返回值类型无关。

  • 参数列表不同
    参数个数不同,对应位置的参数类型不同
  • 方法签名
    方法名 + 参数列表

那为什么我们需要方法重载呢? 当实现的功能相同,但具体的实现方式不同时,我们可以通过定义名称相同、参数(条件)不同的方法,来更好的识别和管理类中的方法。

public static int sum(int a, int b) {
	return a + b;
}

public static long sum(long a, long b) {
	return a + b;
}

public static double sum(double a, float b, int c) {
	return a + b + c;
}

数组

数组就是用来存储同一种数据类型的多个元素的容器,这里的数据类型可以是基本类型,也可以是引用类型

Java中,定义数组的格式有三种:

  • 数据类型[] 数组名 = new 数据类型[长度]

    数据类型即数组中存储元素的数据类型,可以是基本类型或引用类型

    []表示是数组

    new创建数组的关键字,通过new开辟内存空间

    长度表示数组中最多能存储元素的个数,注意:数组长度在定义时指定,以后不可更改

     int[] arr = new int(3);
  • 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, ...};

    这种定义数组的格式,在定义时元素是确定的,避免了内存空间的浪费

     int[] arr2 = new int[]{1, 2, 3};
  • 数据类型[] 数组名 = {元素1, 元素2, 元素3, ...};

    这是上一种形式的一个简写

     int[] arr3 = {1, 2, 3};

那么我们如何访问数据中的元素呢?

一般我们通过数组的索引来访问数组的元素,索引,也叫下标,或者脚标,是数组元素起始位置的偏移量,第一个元素的偏移量为0,所以数组的索引是从0开始的。

取值:数组名[索引]
赋值:数组名[索引] = 值

int[] arr = {11, 22, 33};
arr[0] = 10;  // 10 通过索引操作数组中的元素值

数组最常见的操作就是遍历数组元素,遍历数组需要知道以下知识点:

  • 数组的长度可以通过:数组名.length 来获取
  • 数组的最大索引为数组长度 - 1
  • 数组中未手动赋值的元素,如果定义为int,则默认值0
  • 若直接输出数组变量名,得到的是数组在内存中的地址值

下面来看下数组的相关知识点:

数组的初始化:它其实就是在内存中为数组开辟连续空间并为每个元素赋值的过程,连续空间就是数组元素在内存空间中的存放位置是连续的。

Java中,数组的初始化分为两种,一种是动态初始化,也就是指定数据长度,由系统给出默认值

  • 整型数组:默认值为0
  • 浮点型数组:默认值为0.0
  • 字符型数组:默认值为\u0000(空字符)
  • 布尔型数组:默认值为false
  • 引用类型:默认值为null

另外一种就是静态初始化,由开发者给出初始化值,系统决定数组长度。

Java的内存分配

Java的内存分配分为以下几个区域:

  • 方法区:它用来存储可运行的class文件,包含方法、静态成员、常量等。
  • 栈:方法运行时使用的内存,特点是"先进后出",即最先入栈的方法最后出栈。
  • 堆:存储new出来的数组或对象
  • 本地方法栈:JVM在调用操作系统功能时使用,与开发无关
  • 寄存器:CPU使用,与开发无关

数组类型:变量arr存储的是数组在堆空间中的地址值,而不是数组元素的值,变量arr通过内存地址引用堆内存中的数组,所以数组是引用类型

数组的常见操作

先来看下数组使用中两个常见的问题

  • 数组索引越界异常: ArrayIndexOutOfBoundsException

    当访问了不存在的索引时会触发上面的异常

  • 空指针异常: NullPointerException

    数组引用存储的值为null而非数组的地址值时