一、函数

1. 定义:

定义:为了提高代码的重用性(复用性),对代码进行的抽取。
函数是具有特定功能的一段独立的小程序,也称作为方法。

2. 格式 :

修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…)

{ 
 执行语句; 
 return 返回值 
 }


返回值类型: 函数运行后的结果的数据类型。
参数类型: 是形式参数的数据类型。
形式参数: 是一个变量, 用于存储调用函数时传递给函数的实际参数。
实际参数: 传递给形式参数的具体数值。
return: 用于结束函数。
返回值: 该函数运算后的结果, 该结果会返回给调用者。

3. 注意:

a.当函数运算后,没有具体的返回值时,这时返回值类型用一个特殊的关键字来标识: void
b.当函数的返回值类型时void时,函数中的return语句可以省略不写。
c.函数中只能调用函数,不可以在函数内部定义函数。否则,编译时期就会报错。
d.定义函数时,函数的结果应该返回给调用者,交由调用者处理。

函数:最小的功能单元。
class FunctionDemo{
       public static void main(String[] args){
            int c = add(3,4);
            System.out.println("c = " + c);
      }

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

4、 如何定义一个函数?

a.既然函数是一个独立的功能,那么该功能的运算结果是什么先明确。
b.在明确完结果是什么,自然就知道了在定义该功能的过程中是否需要未知数的内容参与运算。

5、函数的特点

a.定义函数可以将功能代码进行封装。
b.便于对该功能进行复用。
c.函数只有被调用才会被执行。
d.函数的出现提高了代码的复用性。

提问:
如果需要写一个两数相加的例子,那么使用下面的代码一好呢?还是代码二好呢?

代码一
     public static int add(int a,int b){
        return a + b;
    }
代码二
      public static void add(int a,int b){
        System.out.println(a + b);
    }

答案:虽说两种都可以执行出正确的数据,代码一比较好,因为调用者只需要获取两数相加的结果,而不需要你做打印的操作!

6.函数的应用

打印九九乘法表
代码如下:

public static void print99(){
     for(int x = 1; x <= 9; x++){
          for(int y = 1; y <= x; y++){
               System.out.println(y + "*" + x + "=" + y*x + "\t");
          }
     }
}

7.函数的重载

重载的概念:
在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
重载的好处:
方便于阅读,优化了程序设计。
示例如下:

class ChongZaiDemo{
       public static void main(String[] args){
             System.out.println(add(3,4));
             System.out.println(add(3.0,4.0));
             System.out.println(add(3,4,5));
      }

       //加法运算,两个整数的和
       public static int add(int a, int b){
             return a + b;
      }

       //加法运算,两个小数的和
       public static double add(double a, double b){
             return a + b;
      }

       //加法运算,三个整数的和
       public static int add(int a, int b,int c){
             return add(a,b) + c;
      }
}

注意
1、重载与返回值类型无关,只看参数列表。
2、java是严谨性语言,如果函数调用出现不确定性,会编译失败。

二、数组

1. 定义

同一种类型数据的集合。其实,数组就是一个容器。
数组的好处:
可以自动给数组中的元素从0开始编号,方便操作这些元素。

2.格式

元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例如下:

//第一种方式:
int[] arr = new int[5];
//第二种方式
int[] arr1 = new int[]{3,5,1,7};
//第三种方式
int[] arr = {3,5,1,7};

3.数组内存的分配特点

内存分配图:

java 定义方法的返回类型为子类 java定义返回数组的函数_函数


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

内存的划分:
1. 寄存器。
2. 本地方法区。
3. 方法区。
4. 栈内存。
5. 堆内存。

栈内存:
用于存储局部变量,当变量所属的作用域一旦结束,所占空间会自动释放。

堆内存:
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值。
实体中的变量都有默认初始化值,根据类型的不同而不同。整数类型是0,小数类型是0.0或0.0f,boolean类型是false,char类型是'\u0000'。
如果将数组的引用实体设置为null,也就是实体不再被使用,那么会在不确定的时间内被垃圾回收器回收。

4.数组操作常见异常

数组脚标越界异常(ArrayIndexOutOfBoundsException):访问到了数组中的不存在的脚标时发生。
示例:

class ArrayDemo{
   public static void main(String[] args){
        int[] arr = new int[3];
        System. out.println(arr[3]);
  }

}

运行结果:

java 定义方法的返回类型为子类 java定义返回数组的函数_二维数组_02


空指针异常(NullPointerException):当引用型变量没有指向任何实体时,用其操作实体,就会发生该异常。

示例 :

class ArrayDemo{
    public static void main(String[] args){
            int[] arr = null;
            System. out.println(arr[0]);
  }

}

运行结果:

java 定义方法的返回类型为子类 java定义返回数组的函数_java 定义方法的返回类型为子类_03

5.二维数组

二维数组[][]:数组中的数组
格式1:

int[][] arr = new int[3][2];
1、定义了名称为arr的二维数组。
2、二维数组中有3个一维数组。
3、每一个一维数组中有2个元素。
4、一维数组的名称分别为arr[0], arr[1], arr[2]。
5、给第一个一维数组第一个脚标位赋值为78写法是:arr[0][1] = 78;。
6、arr存储的是二维数组的初始地址,arr[0]、arr[1]、arr[2]存储的是一维数组的初始地址。
格式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的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化。
第一个一维数组 arr[0] = {3,8,2};,第二个一维数组 arr[1] = {2,7};,第三个一维数组 arr[2] = {9,0,1,6};。第三个一维数组的长度表示方式:arr[2].length;。