黑马程序员——java流程控制与函数

时间:2022-08-27 11:12:24

黑马程序员——java流程控制与函数

                                                  ------- android培训java培训、期待与您交流! ----------

 

Never saydie ! try ! try ! try !  -- 永不言败,努力,努力,再努力!

<1> 判断结构 if

语句格式分三种:

 

1.    if(条件表达式) {

执行语句;

}

举例:

           int x = 19;

           if (x >= 18){

                      System.out.println("可以浏览本网站");

           }

            System.out.println("完了");

 

2.    第二种:if(条件表达式){

         执行语句;    

       }else{          

                执行语句;    

       }

            举例:

             int x = 1;

                   if (x == 1){

                            System.out.println("男厕所欢迎您");

                   }else {

                            System.out.println("女厕所欢迎您");

                   }

 

3.      第三种:if(条件表达式){

              执行语句;

       }else if (条件表达式){

              执行语句;

       }else{

              执行语句;

       }

           举例:

           int x = 1;

           if (x == 1){

                    System.out.println("男厕所欢迎您");

           }else if(x == 0){

                    System.out.println("女厕所欢迎您");

           }else {

                    System.out.println("无法识别您的性别");

           }

<2> 选择结构 switch

         格式:

         switch(表达式){

         case 表达式里对应的值:

                   执行语句;

         break;

         case 表达式里对应的值:

                   执行语句;

         break;

         ......

         default:

                   执行语句;

         break;//最后一句的break可写可不写,因为程序已经执行到了末尾

         }

 

         举例:

         Stringname = "丽丽";

                   Stringgender = "女士";

                   switch(gender){

                   case"先生":

                            System.out.println(name+ "是一位" + gender + "喜欢吃饭睡觉打dota");

                   break;

                   case"女士":

                            System.out.println(name+ "是一位" + gender + "逛街购物美容");

                   break;

                   default:

                            System.out.println(name+ "是一位" + gender + "打雌性激素保持美貌容颜");

                  

                   }

         重点:switch 结束只有两种情况

         1,当程序执行过程中遇到了break

         2,当程序执行到了末尾处

         应用 switch需要注意的两个细节

 

         1,      当switch表达式的值与其中一个case匹配的时候,这个case里没有写break;语句,那么程序会继续执行下个case里

                  的执行语句,不会再对case值进行判断,应用于当几个case里的值所要执行的语句都一样的时候,我们可以不写break

 

2,       当我们把 default 不是写在最后,default 里面还没有写break的是时候,switch里的表达式与各个case里

的值都部匹配的时候,上面两个条件同时满足的话,程序在default里执行完了还会再去执行case里的语句

 

例如:

int x = 3;

switch (x){

case 4:

           System.out.print("a");

break;

default:

           System.out.print("b");

//这里没有写break,程序不再判断下个case里面的值会继续向下执行

case 5:

           System.out.print("c");

case 6:

           System.out.print("d");

break;//当程序执行到这里遇到了break就结束了

case 7:

           System.out.print("e");

}//此程序输出结果应该是:bc

 

<3> 循环结构

代表语句:while ,do while ,for

 

1.               while语句:

        while (条件表达式)

       {

          执行语句;

        }

例如:

                   intx = 3;

                   while(x<6){

                            System.out.println("x="+x);//循环体

                            x++;//用x自增来控制循环次数

  

   特点:先判断条件,只有条件满足时才执行循环体。

 

2.      do while语句:

 

   do

   {

    执行语句;

   }while(条件表达式);

例如:

                   intx = 3;

                   do{

                            System.out.println("x="+x);//循环体

                            x++;//用x自增来控制循环次数

                   }

                   while(x<6);

  

   特点:无论条件表达式是否成立,循环都先执行一次。

 

3.       for语句:

 

   for(初始化表达式;循环条件表达式;循环后的操作表达式)

   {

    执行语句;

   }

例如:

         for(intx=0; x<10; x++){

                   System.out.println("x="+x);

 

特点:初始化表达式只读一次,判断循环条件为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件重复,到条件不满足为止。

 

4.  for 的嵌套循环,建议做题的时候就弄个双层嵌套就可以,不要弄太多层,影响效率

         格式:

         for(初始化表达式;循环条件表达式;循环后的操作表达式){//这是外层循环

                   执行语句;(循环体)

                   //下面是内层循环

                   for(初始化表达式;循环条件表达式;循环后的操作表达式){

                   执行语句;(循环体)

                   }

         }

例如:

         for (int x=1;x < 6;x++ ){

                   for(int y=1; y<6; y++){

                            System.out.print("*");

                   }

                   System.out.println();

         }

 

注意:

 

(1) for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。

 

                  (2) while与for可以互换,区别在于for为了循环而定义的变量在for循环结束就是,在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。

 

                  (3 ) 最简单无限循环格式:while(true), for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。

 

 

 

5、break与continue语句:

 

        (1)break(跳出):应用于选择结构和循环结构。跳出循环体继续执行下面程序。

 

              (2)continue(继续):应用于循环结构。结束本次循环继续下次循环。

注意:

 

(1)这两个语句离开应用范围,存在是没有意义的。

 

(2)这个两个语句单独存在下面都不可以有语句,因为执行不到.

 

(3)continue语句是结束本次循环继续下次循环。

 

(4)标号的出现,可以让这两个语句作用于指定的范围。

 

<4> 函数   

 

(1)    函数就是定义在类中的具有特定功能的一段独立小程序。函数也称为方法。

 

          (2)函数的格式

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

                            执行语句;

                            return返回值;

                   }

 

                   A:修饰符 后面会重点讲。publicstatic

                   B:返回值类型 这个特定的功能完成后,需要返回一个结果。这个地方就是返回结果的类型。

                   C:函数名 为了方便使用这个函数,给它起个名字。这个名字要符合标识符命名规则。

                   D:参数类型 形式参数的数据类型

                            **:形式参数 自定义的接收方

                            **:实际参数 发出方

                   E:执行语句 那么这个语句是由多条语句组成。

                   F:return 这个功能执行完以后,需要有一个返回值,那么这个值有关键字return带回。

 

         (3)函数的特点

                   A:函数只有被调用后,才执行。

                   B:void 表示没有返回。在这个函数的结尾可以不写return。

                            **其实jvm会自动的结尾处加上return;

 

         (4)如果定义自己的函数 两个明确

                   A:明确该功能的结果 其实就是该功能的返回类型。

                   B:明确该功能的参数 其实就是明确该功能中是否需要未知内容(形式参数)参与运算。‘

                                         明确未知内容的类型和个数。

 

         (5)函数的重载

                   A:函数名相同,参数列表不同。      

                            **参数类型不同。

                            **参数个数不同。

                   B:特点:与返回值类型无关,只看参数列表。

                   C:好处:便于阅读,优化程序设计。

 

<5> 数组

(1)同一种类型数据的集合。其实数组就是一个容器。

           A:只要是容器,就得重点掌握。

(2)数组的好处

           A:可以自动给数组中的元素从0开始编号,方便操作这些元素。

(3)数组的定义格式

           A:当不明确数组中的元素时

                    **举例 int[] arr= new int[3];

           B:当明确数组中的元素时

                    **举例 int[] arr= new int[]{1,2,3,4,5};

(4)什么时候使用数组?

           A:当要操作的数据是多个的时候,你就得想着先把这些数据用数组进行存储。

(5)内存图

           A:栈

                    **存储的是局部变量(在函数中定义的变量)。

                    **变量被使用完后,立即自动释放。

           B:堆

                    **存储的是实体(数组和对象)。

                    **实体:new出来的东西,可以存放很多数据的东西。

                             ***class定义一个类。

                    **堆内存数据的特点

                             ***每个实体都有内存地址

                             ***堆内存中的变量都有默认初始化值

                                       ****int--> 0

                                       ****double--> 0.0

                                       ****boolean--> false

                                       ****char--> '\u0000' 空字符,unicode编码。

                             ***当实体不在被使用的时候,会在jvm空闲的时候,

                                通过java垃圾回收机制使其自动释放。

           C:方法区 后面讲。

           D:本地方法区 调用是Windows系统底层资源,我们也不用考虑。

           E:寄存器 和CPU相关。我们不用考虑。

(6)操作数组最常见的问题

           A:当你访问到数组中的最后一个元素时,还想继续访问,这个时候,会发生角标越界异常。

                    **ArrayIndexOutOfBoundsException

                    **举例 int[] arr= new int[3];

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

           B:当数组不在指向某个实体时,你还继续访问,就会发生空指针异常。

                    **NullPointerException

                    **举例 int[] arr= new int[3];

                           arr = null;

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

(7)常见的数组的操作

           记住:对数组的操作,一定要从角标下手。

           A:遍历操作

                    **数组的属性:length 数组的长度。

                    **格式:数组名.length

           for (int x=0;x < arr.length ;x++){

                    System.out.println("arr["+x+"]="+arr[x]);

           }

           B:获取最值

                    **获取最大值

                    public static intgetMax(int[] arr){

                             int max = arr[0];

                            

                             //i从1开始,因为第一个数不用跟自己比

                             for(int x=1;x<arr.length; x++) {

                                       if(arr[x]>max){

                                                max= arr[x];

                                       }

                             }

 

                             return max;

                    }

 

                    **获取最小值

                    public static intgetMin(int[] arr) {

                             int min = arr[0];

                            

                             //i从1开始,因为第一个数不用跟自己比

                             for(int i=1;i<arr.length; i++) {

                                       if(arr[i]<min){

                                                min= arr[i];

                                       }

                             }

 

                             return min;

                    }

 

C:排序

                    **选择排序

                    原理:如果拿0角标上的元素依次和后面的元素进行比较,

                      第一次内循环结束后,最小值出现在了0角标位置。

                   

                    就比如我们打印三角形:

                    ****

                    ***

                    **

                    *

                    代码实现:

                    public static voidselectSort(int[] arr){

                             //i<arr.length-1n个数两两比,n-1次就能获得最值。

                             for(int i=0;i<arr.length-1; i++){

                                       //0角标元素没必要和自己比,所以j从1开始。

                                       //发现j为了不重复比较,总是要比i大1,所以j从i+1开始

                                       for(intj=i+1; j<arr.length; j++){

                                                if(arr[j]<arr[i]){

                                                         inttemp = arr[i];

                                                         arr[i]= arr[j];

                                                         arr[j]= temp;

                                                }

                                       }

                             }

                    }

 

                    **冒泡排序

                    原理:两个相邻元素进行比较,第一次比较完以后,最大值出现在了最大角标处。

 

                    public static voidbubbleSort(int[] arr){

                             //i<arr.length-1n个数两两比,n-1次就能获得最值。

                             for(int i=0;i<arr.length-1; i++){

                                       //为了防止角标越界,j<arr.length-1

                                       //为了减少比较次数,j<arr.length-1-i

                                       for(intj=0; j<arr.length-1-i; j++){

                                                if(arr[j]>arr[j+1]){

                                                         inttemp = arr[j];

                                                         arr[j]= arr[j+1];

                                                         arr[j+1]= temp;

                                                }

                                       }

                             }

                    }

           D:传递参数

                    **调用的时候,传递是基本类型的值的时候,形参改变对实参没有任何影响。

                    **调用的时候,传递是引用类型的地址值的时候,形参改变对实参有直接影响。

数组初始化过程

<1> 主函数进栈,然后在main()中有一个数组的引用arr

<2> 在堆内存中开辟空间,

<3> 在堆内存中建立数组对象,并进行默认初始化

<4> 对属性进行初始化,分配内存地址值

         <5> 将内存地址赋给栈内存中的p变量

 

<6> 二维数组

(1)int[][] arr = new int[3][2];

                   A:定义了名称为arr的二维数组

                   B:二维数组中有3个一维数组

                   C:每一个一维数组中有2个元素

                   D:一维数组的名称分别为arr[0],arr[1], arr[2]

                   arr:二维数组名

                   arr[1]:二维数组中的第二个数组名

                   arr[1][1]:二维数组中的第二个数组的第二个元素

                   E:给第一个一维数组1脚标位赋值为78写法是:arr[0][1]= 78;

         (2)格式2:int[][] arr= new int[3][];

                   A:二维数组中有3个一维数组

                   B:每个一维数组都是默认初始化值null

                   C:可以对这个三个一维数组分别进行初始化

                     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}};

                   A:二维数组有3个一维数组。

                   B:第一个一维数组有3个元素

                      第二个一维数组有2个元素

                      第三个一维数组有4个元素

         (4)二维数组的遍历

                   publicstatic void printArray2(int[][] arr2)

                   {

                            for(inti=0; i<arr2.length; i++){

                                     for(intj=0; j<arr2[i].length; j++){

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

                                     }

                                     System.out.println();

                            }

                   }

                                                               ------- android培训java培训、期待与您交流! ----------