2.7函数
- 函数定义
- 函数特点
- 函数应用
- 函数重载
2.7.1函数定义
- 什么是函数?
• 函数就是定义在类中的具有特定功能的一段独立小程序。
• 函数也称为方法。 - 函数的格式:
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,)
{
执行语句;
return 返回值;
}
返回值类型:函数运行后的结果的数据类型。
参数类型:是形式参数的数据类型。
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
实际参数:传递给形式参数的具体数值。
return:用于结束函数。
返回值:该值会返回给调用者。
2.7.2函数的特点
- 定义函数可以将功能代码进行封装,便于对该功能进行复用。
- 函数只有被调用才会被执行。
- 函数的出现提高了代码的复用性。
- 对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一
行可以省略不写。 - 注意:
1.函数中只能调用函数,不可以在函数内部定义函数。
2. 定义函数时,函数的结果应该返回给调用者,交由调用者处理。
2.7.3函数的应用
-
两个明确:
1.明确要定义的功能最后结果是什么?
(明确返回值类型)
2.明确在定义的功能中,是否需要其他未知内容参与运算。
(明确参数列表) -
示例:
需求:定义一个功能,可以实现两个整数的加法运算。
分析:
1. 该功能的运算结果是什么?
是两个数的和 是int型 (返回值类型为int)。
2.在实现该功能的过程中是否有未知内容参与运算?
需要两个整数,被加数和加数是不确定的(参数列表 (int a,int b))。
代码:
int add(int a,int b){
return a+b;
}
2.7.4函数的重载
- 定义:在同一个类中,允许存在一个以上的同名函数,只要他们的
参数个数
或者参数类型
不同即可。 - 重载的特点:
与函数的返回值类型
无关,只和参数列表有关
。 - 重载的好处:
方便于阅读,优化了程序设计。 - 重载示例:
返回两个int型数的和
int add(int a,int b){ return a+b; }
返回两个double型数的和
double add(double a,double b){ return a+b; } //与第一个相比,参数类型 不同
返回三个int型数的和
int add(int a,int b,int c){ return a+b+c;} //与第一个相比,参数个数 不同哦,多了个参数c。
2.8数组
- 数组的定义
- 数组的内存分配及特点
- 数组操作常见问题
- 数组常见操作
- 数组中的数组
2.8.1 数组的定义
概念:同一种类型数据的集合。其实数组就是一个容器。
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
2.8.2数组的内存分配及特点
int[] arr = new int[4];
1.arr引用
new int[3],返回地址给arr引用。
arr通过地址指向对应的实体数组的首地址。
2.8.2.1内存结构
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空
间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内
存管理方式。
- 栈内存
用于存储局部变量,当数据使用完,所占空间会自动释放。 - 堆内存
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值。
实体中的变量都有默认初始化值。
实体不在被使用,会在不确定的时间内被垃圾回收器回收。 - 方法区,本地方法区,寄存器
2.8.3数组操作常见问题
- 数组脚标越界异常(ArrayIndexOutOfBoundsException)。
int[] arr = new int[2];
System.out.println(arr[3]);
访问到了数组中的不存在的脚标时发生。 - 空指针异常(NullPointerException)
int[] arr = null;
System.out.println(arr[0]);
arr 引用没有指向实体,却在操作实体中的元素时。
2.8.4数组常见操作
- 获取最值(最大值和最小值)
- 排序(选择排序,冒泡排序)
- 查找(折半查找法)
获取最大值
方法一:交换数组中的具体数据实现
public static int getMax(int[] arr){
int max = arr[0]; //交换数组中的具体数据实现
for(int i=1;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
return max;
}
方法二:交换数组的角标实现
public static int getMaxByIndex(int[] arr){
int max = 0; //交换数组的角标实现
for(int i=1;i<arr.length;i++){
if(arr[i]>arr[max]){
max=i;
}
}
return arr[max];
}
获取最小值:
方法一:交换数组中的具体数据实现
public static int getMin(int[] arr){
int min = arr[0]; //交换数组中的具体数据实现
for(int i=1;i<arr.length;i++){
if(arr[i]<min){
min=arr[i];
}
}
return min;
}
方法二:交换数组的角标实现
public static int getMinByIndex(int[] arr){
int min = 0; //交换数组的角标实现
for(int i=1;i<arr.length;i++){
if(arr[i]<arr[min]){
min=i;
}
}
return arr[min];
}
2.8.5数组中的数组
二维数组
格式1:int[][] arr = new int[3][2];
- 定义了名称为arr的二维数组
- 二维数组中有3个一维数组
- 每一个一维数组中有2个元素
- 一维数组的名称分别为arr[0], arr[1], arr[2]
- 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2:int[][] arr = new int[3][];
- 二维数组中有3个一维数组
- 每个一维数组都是默认初始化值null
- 可以对这个三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}}; - 定义一个名称为arr的二维数组
- 二维数组中的有3个一维数组
- 每一个一维数组中具体元素也都已初始化
第一个一维数组 arr[0] = {3,8,2};
第二个一维数组 arr[1] = {2,7};
第三个一维数组 arr[2] = {9,0,1,6};
第三个一维数组的长度表示方式:arr[2].length;
代码练习:
ForFor示例
/*
打印:
***
***
***
***
***
*/
class ForForDemo{
public static void main(String[] args){
for(int x=0;x<5;x++){ //外循环--- 控制行数
for(int y=0;y<3;y++){ //内循环-----控制列数
System.out.print("*");
}
System.out.println();
}
}
}
上三角 星型
——————————————————————————————————————————————————
上三角:
*
**
***
****
*****
分析:一共有五行,外循环5次,内循环每次递增 且和行数一致,第一行一个* 第二行两个*
for(int x=1;x<=5;x++){
for(int y=1;y<=x;y++){//1-1 1-2 1-3 1-4 1-5
System.out.print("*");
}
System.out.println();
}
第二种方法:
for(int x=1;x<=5;x++){
for(int y=x;y>0;y--){ /* 1-1 2-1 3-1 4-1 5-1
* y=1 1>0; * 0=y-- 0>0;
y=2 2>0; * 1=y-- 1>0; * 0=y-- 0>0; */
System.out.print("*");
}
System.out.println();
}
下三角 星星
——————————————————————————————————————————————————————
下三角:
*****
****
***
**
*
for(int x=1;x<=5;x++){
for(int y=x;y<=5;y++){//1-5 2-5 3-5 4-5 5-5
System.out.print("*");
}
System.out.println();
}
第二种:
for(int x=1;x<=5;x++){
for(int y=5;y>=x;y--){//5-1 5-2 5-3 5-4 5-5
System.out.print("*");
}
System.out.println();
}
——————————————————————————————————————————————————
99乘法表
99乘法表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
分析:
从形式看,与上三角型相识,先打印上三角形,确定大概布局
外循环分析:行数一共有9行,外循环要循环9次
内循环分析:对第四行 每一列,被乘数都是从1开始递增到4(与行数相同?),乘数都是4(与行数相同)
所以形式是
for(i=1;i<=9;i++){ //控制外循环 9次
for(y=1;y<=x;y++){ //内循环 上三角形式
}
}
源代码:
public class ForFor99{
public static void main(String[] args){
for(int x=1;x<=9;x++){
for(int y=1;y<=x;y++){
System.out.print(y+"*"+x+"="+y*x);
System.out.print("\t");//制表符 严格按表格划分
}
System.out.println();//换行
}
}
}
函数
需求1: 定义一个功能,完成两个整数的和的获取。
- 明确一:这个功能的结果是什么?
结果是和,是int型。 - 明确二:这个功能实现过程中是否需要未知内容参与运算?
有,被加数和加数。明确参数列表。
public static int add(int a, int b){ //static 修饰符 使得此方法为静态方法,可以被其它静态方法调用。
return a+b;
}
需求2: 定义一个功能,画一个矩形在控制台。
- 明确一:这个功能的结果是什么?
是一个矩形图案,无返回值, - 明确二:这个功能实现过程中是否需要未知内容参与运算?
有,矩形的长和宽,具体值不确定,(类型int型)
public static void drawRectangle(int length,int width){
for(int x=1;x<=width;x++){
if(x==1||x==width){ //第一行和最后一行都是 ********* 中间没有空格
for(int y=1;y<=length;y++){
System.out.print("*");
}
}else{ //第一列和最后一列有星号,形式 * *
for(int y=1;y<=length;y++){
if(y==1||y==length)
System.out.print("*");
else
System.out.print(" ");
}
}
System.out.println();
}
}
需求3: 定义一个功能,比较两个数是否相等。
明确一:这个功能的结果是什么?
结果是true 或者false,是boolean类型
明确二:这个功能实现过程中是否需要
public static boolean equals(int a,int b){
return a==b;
}
需求4: 定义一个功能,获取两个整数中较大的那个数。
明确一:这个功能的结果是什么?
结果是 最大的数,是int型
明确二:这个功能实现过程中是否需要未知内容参与运算?
有,两个比较的数。int型
public static int getNumMax(int num1,int num2){
return (num1>num2)?num1:num2;
}
需求5:定义功能,打印99乘法表。
明确一:这个功能的结果是什么?
结果99乘法表,无返回值。
明确二:这个功能实现过程中是否需要未知内容参与运算?
可以不需要
public static void multiTable99(){
for(int x=1;x<=9;x++){
for(int y=1;y<=x;y++){
System.out.print(y+"*"+x+"="+y*x);
System.out.print("\t");
}
System.out.println();
}
}
需求6:根据考试成绩获取学生分数对应的等级
90~100 A
80~89 B
70~79 C
60~69 D
60以下 E
明确一:这个功能的结果是什么?
结果是 等级 ,字符型
明确二:这个功能实现过程中是否需要未知内容参与运算?
有,学生分数
public static char getRank(int grades){
char level;
/*if(grades>=90&&grades<=100){
level='A';
}else if(grades>=80&&grades<=89){
level='B';
}else if(grades>=70&&grades<=79){
level='C';
}else if(grades>=60&&grades<=69){
level='D';
}else
level='E'; */
//使用switch实现
switch(grades/10){
case 9:
level='A';
break;
case 8:
level='B';
break;
case 7:
level='C';
break;
case 6:
level='D';
break;
default:
level='E';
break;
}
return level;
}
——————————————————————————————————————————————————
数组
数组最值(最大值,最小值)
最大值:
public static int getMax(int[] arr){
int max = arr[0]; //交换数组中的具体数据实现
for(int i=1;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
return max;
}
最小值
public static int getMin(int[] arr){
int min = arr[0]; //交换数组中的具体数据实现
for(int i=1;i<arr.length;i++){
if(arr[i]<min){
min=arr[i];
}
}
return min;
}
1选择排序
思路;
1.第一次外循环,先取第一个数 分别和之后的数比较,如果后面的数比第一个数大,就把数大的数值赋给第一个,以此类推。
2.第二次外循环,取第二个数,分别和之后的数比较,如果后面的数比第一个数大,就把数大的数值赋给第一个,以此类推。
3.。。。。。。。。。。
4.直到取到最后一个数,结束循环。
*/
public static void selecSortaA(int[] arr){ //从小到大排序
for(int x=0;x<arr.length;x++){
for(int y=x+1;y<arr.length;y++){
if(arr[x]>arr[y]){
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
}
}
}
2冒泡排序
每一轮比较以后最大的数沉到底面(最后),因此,下一轮比较排除该数,体现在内循环减一。
public static void bubbleSort(int[] arr){
for(int x=0;x<arr.length-1;x++){
for(int y=0;y<arr.length-1-x;y++){
if(arr[y]>arr[y+1]){
//swap(arr,y,y+1);
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
}
折半查找(二分查找)
public static int binarySearch_2(int[] arr,int key){
int mid,min,max;
min=0;
max=arr.length-1;
while(min<max){//如果遍历完整个数组,结束循环
mid=(min+max)/2;
if(key>arr[mid])
min=mid+1;
else if(key<arr[mid])
max=mid-1;
else //此时key==arr[mid]
return mid;
}
return -1;
}
一个整数如何转换为16进制数
转换的数存储在数组中
public static char[] decToHex2(int num){
char[] tab ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//表
char[] arr = new char[8];
int pos=arr.length;
while(num!=0){
int i = num&15;
arr[--pos]=tab[i];
num=num>>>4;
}
return arr; //返回引用
}
转换的数存储在字符串中
public static String decToHex(int num){
char[] tab ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//表
String str="";
char temp =0; //临时存储0到F字符
while(num!=0){
/*与1111(15)相与获得 4位二进制数,相当于一位1
6进制数,通过此数,去表里查
询对应的字符比如0对应0 10对应A
*/
int i =num&15;
temp = tab[i];
str = str+temp;//将字符连接
num=num>>>4; //右移4位
}
return reverse(str);
}
public static String reverse(String str){ //字符串反转
return new StringBuilder(str).reverse().toString();
}
进制转换
public static char[] toHex(int num){//十进制转十六进制
return binary(num,15,4);//与1111相与,每次获取为4位二进制数
}
public static char[] toOct(int num){//十进制转八进制
return binary(num,7,3);//与111相与,每次获取为3位二进制数
}
public static char[] toBin(int num){//十进制转二进制
return binary(num,1,1);//与1相与,每次获取为1位二进制数
}
public static char[] binary(int num,int base,int offect){//数,进制 ,位操作偏移量
char[] hextab ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//进制表
char[] temp= new char[32];
int pos=temp.length;
while(num!=0){
int x=num&base;
temp[--pos]=hextab[x];//与b1111相与 获取4位二进制数,也即时是一位16进制数
num=num>>>offect; //右移offect位
}
return temp;
}
二维数组
/**
二维数组
*/
public class TwoArrayDemo{
public static void main(String[] args){
int[][] arr = new int[3][2];//定义一个二维数组,数组中有3个一维数组,每个一维数组有2个int型的元素
System.out.println(arr[0]);//
int[][] arr1 = new int[3][];
System.out.println(arr1[0]);//null
int[] arr3 =new int[3];
System.out.println(arr3[0]);//0
}
}