方法:

方法的定义与使用:

java中方法就是函数,将实现某些功能的代码封装到方法中。

/*
	概念:就是完成某个功能的代码,函数就是方法
	格式:
		修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2....){
			方法体语句:
			return 返回值:
		}
	详细解释:
		修饰符:目前就用 public static
		返回值类型:就是功能结果的数据类型。
		方法名:符合命名规则即可,方便我们的调用
		参数:
			实际参数:就是实际参与运算的
			形式参数:就是方法定义上的,用于接收实际参数的
		参数类型:就是参数的数据类型
		参数名:就是变量名
		方法体语句:就是完成功能的代码
		返回值:就是功能的结果。由return带给调用者
	要想写好一个方法,必须明确两个东西:
		A:返回值的类型:结果的数据类型
		B:参数列表:你要传递几个参数,以及每个参数的数据类型
		
	需求:求两个数据之和的案例
	
	方法的执行特点:不调用,不执行
	
	如何调用方法?
		A:单独调用,一般没有意义,不推荐
		B:输出调用,但是不够好
		C:赋值调用,推荐使用
		
*/
class FunctionDemo{
	public static void main(String[] args){
		int x = 10;
		int y = 20;
		
		// 方式1:单独调用
		sum(x, y);
		// 方式2:输出调用
		System.out.println(sum(x, y));
		// 方式3:赋值调用
		int result = sum(x,y);
		System.out.println(result);
	}
	
	/*
		需求:求两个数据之和的案例
		
		两个明确:
			返回值类型:int
			参数列表:2个,都是int类型
	*/
	public static int sum(int a,int b){
		int c = a + b;
		return c;
	}
}

注意:无返回值时,返回值类型为void,只能使用单独调用

练习:

/*
	键盘录入两个值,返回两个数中的较大值
*/
import java.util.Scanner;
class MaxDemo{
	// 求最大值
	public static int max(int a,int b){
		if(a > b){
			return a;
		}else{
			return b;
		}
		
	}
	
	// 主方法
	public static void main(String[] args){
		// 创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入第一个数据");
		int a = sc.nextInt();
		
		System.out.println("请输入第二个数据");
		int b = sc.nextInt();
		
		int result = max(a,b);
		System.out.println("最大值为:"+result);
		
		
	}
}

方法重载:

对于有相同功能的函数,但是参数的个数发生了改变,一种情况是用不同的名字命名,但是我们的方法要求见名知意,针对这种情况:方法的功能相同,参数列表不同的情况,为了见名知意,Java允许他们起一样的名字。

/*
	方法重载:
		概述:在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数
			或者参数类型不同即可。
		特点:
			A:与返回值类型无关,只看方法名和参数列表
			B:在调用时,虚拟机通过参数列表的不同来区分同名方法
*/
class FunctionDemo1{
	// 求两个数的和
	public static int sum(int a, int b){
		return a + b;
	}
	
	// 求三个数的和
	public static int sum(int a, int b, int c){
		return a + b + c;
	}
	
	// 求四个数的和
	public static int sum(int a, int b, int c, int d){
		return a + b + c + d;
	}
	
	public static void main(String[] args){
		System.out.println(sum(10,20));
		System.out.println(sum(10,20,30));
		System.out.println(sum(10,20,30,40));
	}
}

总结:方法名相同时,调用方法的使用会根据参数的个数和类型进行选择,这是JVM自己进行的。

注意事项:

  • 方法不调用不执行
  • 方法与方法平级关系,不能嵌套使用
  • 方法定义的时候,参数用逗号隔开
  • 方法调用的时候,不需要在传递数据类型
  • 如果方法有明确的返回值,一定要有return带回一个值

数组:

数组的定义:

/*
	数组:
		概念:
			A:数组是存储同一种数据类型多个元素的集合,也可以看成是一个容器
			B:数组既可以存储基本数据类型,也可以存储引用数据类型
		格式定义:
			格式1:数据类型[] 数组名;
			格式2:数据类型 数组名[];
		注意:这两种定义做完了,数组中是没有元素值得。并且推荐使用格式1.
			
*/
class ArrayDemo{
	
	
	public static void main(String[] args){
		// 定义一个数组
		int[] a;
		int a[];
		
	}
}

数组的初始化和索引:

/*
	数组的初始化:
		概述:
			A:Java中的数组必须先初始化,然后才能使用。
			B:所谓初始化,就是为数组中的数组元素分配内存空间,并未每个数组元素赋值
		初始化方式:
			A:动态初始化,初始化只指定数组长度,由系统为数组分配初始值,数组长度必须是
				数组中元素个数
				格式:数据类型[] 数组名 = new 数据类型[数组长度];
			B:静态初始化,初始化时指定每个数组元素的初始值,由系统决定数组长度
                格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2...}
			
*/
class ArrayDemo1{
	public static void main(String[] args){
		// 动态初始化
		// 定义一个int类型的数组,可以存放3个int类型的值
		int[] arr = new int[3];
		System.out.println(arr); // 输出的是地址值 [I@15db9742

        // 静态初始化
        int[] arr = new int[]{1,2,3};
        // 简化格式
        int[] arr = {1, 2, 3};
		
		// 因次,我们需要或许地址中的元素。
		// 在java中,数组中的每一个元素都是有编号的,从0开始,最大编号是数组的长度-1
		// 用数组名和编号配合就可以获取指定编号的元素,这就是常说的索引
		// 通过数组名访问数据的格式是:数组名[索引];
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
	}
}

java中的内存分配:

java程序在运行时,需在内存中分配空间,为了提高运算效率,就对空间进行了不同区域的划分,因为每一篇区域都有特定的处理数据和内存管理方式。

  • 栈 存储局部变量
  • 堆 存储new出来的东西
  • 方法区
  • 本地方法区(和系统有关)
  • 寄存器(给cpu使用)

局部变量:在方法定义中或者方法声明上的变量都称为局部变量。 

数组的赋值和内存空间的变化: 

/*
	给数组赋值
*/
class ArrayDemo2{
	public static void main(String[] args){
		int[] arr = new int[3];
		System.out.println(arr[0]);
		// 给数组赋值
		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		System.out.println(arr[0]);
	}
}

一个数组的内存空间: 

java方法参数是一个泛型类 java方法参数是数组_java

两个数组的内存空间变化

 

java方法参数是一个泛型类 java方法参数是数组_数组_02

 注意:

  • 不要动态和静态初始化同时使用。
  • 注意数组索引越界异常
  • arr = null; 导致数组不指向堆内存了

小技巧:

  • 求数组的长度,数组有length属性:arr.length