java编程基础(四)函数与数组

---恢复内容开始---

函数与数组

一、函数

1.1 函数的概述

函数的概念是在日常的使用过程中被提出来的,如果我们在编写程序的过程中发现有一段代码在程序中多次使用,我们可以把这段代码封装成独立的小程序,这段小程序就叫做函数,使用的时候调用它就行了,减小了代码量,提高了代码的复用性。

 

1.2 函数的格式

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

         {

                            执行语句;

                            return 返回值;

         }

 

 

返回值类型: 运行这段程序得出的一个运算结果,结果类型,如果函数没有返回值则用void:来表示该函数没有返回值。

函数名:仅仅是一个标识符,可以随意起名字。

形式参数:是一个变量,用于存储调用函数传递进来的实际参数。

实际参数:传递给形式参数的具体数值。

返回值:返回给调用者(若函数的返回值类型为void则没有返回值,若定义了返回值类型却没有return返回值或者返回值的数据类型跟定义的返回值的数据类型不同,则程序会报错)。

 

定义函数的步骤:

    1:先确定函数的形参列表(看有几个变量参与函数运算)

    2:再看返回值类型,是否有运算结果(返回值)

    3:最后定义运算语句。

 

案例:定义一个函数用来获取2个整数中的较大的数。

1.由案例得该函数由两个变量参与运算,而且数据类型为整型。

2.较大的数的数据类型为整型,所以返回值类型为整型。

3.通过if语句来比较,找出最大值

 

怎么调用函数:

使用函数名再跟上要传入的实参列表,如果方法有返回值,可以定义一个变量来接收返回值。

具体代码如下:

 

运行结果:

 

注意:main方法是程序的入口由虚拟机调用,方法和方法之间不能嵌套,方法之间通过调用来使用。

方法什么时候执行完毕:

当执行完return语句,或者执行到方法末尾的花括号时方法结束。

该类中包含了两个方法,main方法和getMax方法。main方法由java虚拟机调用,并且main方法的写法是固定的。Main方法可以调用其他方法。

当调用getMax方法时,变量i的值传递给方法中的x,j的值传递给方法中的y,并开始执行getMax方法中的语句,执行return,并返回运算结果。getMax方法运行完毕。

 

1.3 函数的特点

1. 定义函数可以将功能代码进行封装

2.定义函数可以提高代码的复用性。

3.函数只有被main函数或其他函数调用才能执行。

4.函数都会返回一定的值,若返回值为空,则函数的返回值类型为void,return语句可省略不写;若返回值不为空,则函数的返回值类型,就是函数的返回值的数据类型。

5.函数不能嵌套函数,函数与函数是平级的关系,只能调用另一个函数,而非嵌套。

 

1.4 函数的应用

案例1. 画矩形

 

案例2. 比较两个数是否相等

注意:

  1. 函数中只能调用函数,不能定义函数,没有定义函数之前,不能调用函数。
  2. 输出语句只能对有具体返回结果的函数的进行打印。
  3. 返回值类型是void的函数,是不可以被输出语句打印的。

 

1.5 函数的重载

     函数重载的定义:在一个类中有一个以上的同名函数,他们的参数列表不同(参数的个数或者参数的数据类型不同),我们把这种现象称作函数的重载,函数的重载和返回值类型无关,返回值类型可以相同也可以不同。

 

     函数重载的意义:为了增强方法的阅读性,优化程序设计。

 

案例1: 九九乘法表

 

 

二、数组

2.1 数组的概述

在前面的学习中,我们学习了一些基本的数据类型和变量,众所周知,变量是一个容器,只能存储一个数据,但我们如果想存储一连串同种类型的数据又该怎么做?这时候数组的概念就诞生了,数组是专门用来存储多个同种数据类型的数据的。其实数组也是一个容器,只不过这个容器的功能比变量要强大多了。

 

如果需要存储大量的数据,例如如果需要读取100个数,那么就需要定义100个变量,显然重复写100次代码,是没有太大意义的。如何解决这个问题,Java语言提供了数组(array)的数据结构,是一个容器可以存储相同数据类型的元素,可以将100个数存储到数组中。

2.2 数组的定义

格式1:

元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

示例:int[] arr = new int[5];

 

格式2:

元素类型[] 数组名 = new 元素类型[]{元素,元素,……};

int[] arr = new int[]{3,5,1,7};

int[] arr = {3,5,1,7};

 

注意:给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。可以使用length 属性获取数组的大小。数组的好处就是数组中的每个元素都有从0开始顺序分配的下标,可以通过数组的下标来获取数组中的元素。

 

2.3 数组初始化

格式一:先定义数组的结构再初始化

示例:int[] arr = new int[5];

      arr[0]=1;

      用户没有初始化的元素,系统默认初始化置0,与变量相对比,变量必须用户自己初始化。

 

格式二:边定义数组的结构,边初始化

示例:int[] arr = new int[]{3,5,1,7};

int[] arr = {3,5,1,7};

定义了数组的长度为4,初始化了数组中个元素的值。

 

int i = arr.length(); 该语句用于获取数组的长度。

2.4 数组中常见的异常

1. 一数组角标越界异常:,注意:数组的角标从0开始。

public static void main(String[] args) {

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

       System.out.println(x[3]);

       //java.lang.ArrayIndexOutOfBoundsException

}

 

2. 空指针异常:

public static void main(String[] args) {

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

       x = null;

       System.out.println(x[1]);

       // java.lang.NullPointerException

    }

 

2.5 数组的内存分析

案例分析:

 

创建数组时,首先会在栈内存中创建名为arr的局部变量,此变量保存的是堆内存中数组元素的首地址,数组运算按下表顺序依次排列,找到了第一个元素,就可以通过地址叠加找到数组中的其他元素。

 

用new关键字创建的实体都是保存在堆内存中,然后在栈内存中定义一个局部变量指向它。

 

Jvm有垃圾回收机制,当堆内存的实体没有局部变量来指向它,或者调用该实体的程序执行网,jvm就会把这些实体视为垃圾,启动垃圾回收机制回收,这和c语言有很多的区别,c语言是不会自动回收不用的内存空间的。

 

 

2.6 数组的常见操作

操作1 遍历

遍历需要使用数组的length属性函数来获取数组的长度。

 

 

操作2 获取最大值

 

 

2.7 数组元素的排序与查找方式

案例1 直接排序

 

 

案例二 冒泡排序

 

 

案例3 折半查找(二分法)

 

案例4 数组翻转

 

 

2.8 二维数组

二维数组:实质就是存储是一维数组,只不过一维数组里面存储的是另外一些一维数组的地址

数组定义:

       数组类型[][] 数组名 = new 数组类型[一维数组的个数][每一个一维数组中元素的个数];

 

疑问: 为什么a.length = 3, a[0].length = 4?

 

数组的初始化:

         静态初始化:

                   int [][] a = new int[][]{ {12,34,45,89},{34,56,78,10},{1,3,6,4} };

         动态初始化:

                

二维数组常见的操作:

  1. 遍历二维数组
  2. 对二维数组求和

 

class Demo3

{

    // 定义一个遍历二维数组的功能函数

    public static void printArr2( int [][] a ){

       // 1. 拆开二维数组

       for ( int i = 0 ; i < a.length ; i++ )

       {

          // 2. 拆开一维数组获取数据

          for ( int j = 0 ; j < a[i].length ; j++ )

          {

              System.out.print( a[i][j]+" ," );

          }

       }

   

    }

    // 定义一个函数计算二维数组中的元素的累加和

    public static long getSum( int [][] a ){

       // 0. 定义一个结果变量

        long sum = 0L;

       // 1. 拆开二维数组

       for ( int i = 0 ; i < a.length ; i++ )

       {

          // 2. 拆开一维数组获取数据

          for ( int j = 0 ; j < a[i].length ; j++ )

          {

              sum+=a[i][j];

          }

       }

       return sum;

    }

   

    // 统计二维数组中元素的个数

    public static int getDataCount( int [][] a ){

       // 0. 记录元素个数

       int  count = 0;

       // 1. 拆开二维数组

       for ( int i = 0 ; i < a.length ; i++ )

       {

          // 2. 拆开一维数组获取数据

          for ( int j = 0 ; j < a[i].length ; j++ )

          {

              count++;

          }

       }

      return count;

    }

    public static void main(String[] args)

    {

      

       int [][] a = new int[][]{ {23,4,5},{2},{4,5,78,56,90} };

       printArr2( a );

        System.out.println();

       System.out.println("累加和是: "+getSum( a ) );

       System.out.println("统计元素个数: "+getDataCount( a ) );

       System.out.println("Hello World!");

      

      

    }

}

 

     

 

 

 

 

---恢复内容结束---

posted @ 2017-11-08 19:06  浅笑微凉  阅读(901)  评论(0)    收藏  举报