• 方法数组


    什么是方法?

    循环操作(while,do  while , for循环):

          解决的是代码重复的问题,重复做某一件事情.

          此时得重复:有规律的,语句格式是相同的,有规律的.

    循环操作真的能解决所有的重复吗?    

          针对于某一种功能的重复操作,循环解决不了,此时得使用方法.

    方法就是一段特定功能的代码块

    {

      代码块

    }

    为什么要有方法?

    提高程序的复用性和可读性

    例如:愤怒的小鸟中有发射小鸟的代码,那么每发射一次,我们就需要写一次,这样程序的整体长度,可读性和可扩展性大大的降低,当前的发射代码我们就可以进行一定修改,

    将这段代码写在一个代码块中,这个代码块在其一个名字,每次调用的时候直接调用代码块的名字,就可以调用当前这段功能代码了,提高了当前程序的复用性和可读性

     

    ps:方法与函数的关系.

    在某些语言中把当前功能代码块成为函数,那么函数与方法本质上是没有区别的.所以

    在Java中我们既可以称当前代码块是函数,也可以叫做方法名称中不做区分,但是在实际使用和开发中推荐称呼为"方法"

    java面向对象语言 -->  方法  --> 面向过程 --> 函数

    方法的格式

    语法:

    访问权限修饰符 [其他的修饰符 如static] 返回值类型 方法名(参数类型1 形参1,参数类型2 形参2,...){//形参列表

             //方法体

          return 返回值;

          }

    方法的格式说明:

    修饰符:public,static等,static修饰的方法属于类,直接使用类名调用即可

    ps:类名.方法名 --> 当前类的方法

      同一个类中(同一个文件中),可以直接调用静态方法:方法名即可

    现在都使用static修饰.

    返回值类型: 方法其实是在完成一个功能,该功能操作完毕之后,是否需要给调用者返回一个结果.如果不需要给调用者返回结果,此时使用关键字void来声明,无返回的意思.

    ps:可以省略return关键字,千万不要使用[return 返回值] 的形式书写

    void类型  --> 基本数据类型  --> 引用数据类型(new)

    栈空间            堆空间

                    

    方法名称:遵循标识符的规范,使用动词表示,首字母小写,若是多个单词组成,使用驼峰表示法,以后的每一个单词首字母都大写,getEmployeeName.

    参数列表:参数列表 == 参数的类型 + 参数的个数  + 参数的顺序.

    ps: () 可以没有任何参数 --> 什么都不要写

         可以有多个参数 ---> 数据类型 名字, 数据类型 名字 ....

         就近原则-->  方法中同样适用

         定义了一些变量,这些变量是为了方法内部提供使用的

         定义的变量其实有一个名词 --> 形参

    形式参数:形参就是一个变量,

    ps:要使用定义的变量进行操作,需要给参数进行赋值 --> 实参

    实际参数:实参就是一个值,传参就是把一个值给一个形参赋值

    ps:形参名可以和实参名相同

    int a = 10;

    (int a)

    调用方法(a)

    方法签名:方法签名 == 方法名称  +  方法参数列表;

     在同一个类中,方法签名是唯一的,否则编译报错.

      方法体:方法的{}中的代码,表示具体完成该功能的代码.

    返回值: 在方法内部,使用return关键字;

     功能1:给调用者返回一个结果值,此时该方法不能使用void修饰.

    ps:若使用return时 return 返回值;此时方法不能使用void修饰

     功能2.结束方法,若有返回值类型,方法必须使用return关键 +返回值,若是void不需要使用return,写也可以但是不行添加返回值

    ps:若使用return带有返回值,调用方法者可选择接收,也可以不接收

      若使用return没有返回值,调用方法者绝对不能接收

      只要方法在打印语句中能输出结果,方法就一定带有返回值

    System.out.println(方法名());

    方法的位置:

        1):在类中定义,在Java中最小的程序单元是类.

    2):方法定义在其他方法之外,方法和方法是兄弟关系.(在方法体中是不能定义方法的)

    ps:Java中没有方法声明,定义即可用

    3):方法定义的先后顺序不影响.(你到饭店先上宫保鸡丁和糖醋排骨影响你吃吗)

    方法的内存图和方法调用过程

     

    ps:Java面向对象的语言

      封装,继承,多态

    方法:其实就是封装特性的一种体现

    方法的重载 -- 多态的

    同一个事物,被不同的对象所触发,得到的结果是不同

    重载:方法名相同,参数列表不同(数据类型, 个数不同, 顺序不同其中一个满足即可),称为重载

    拓展:递归方法(算法):

    从前有座山,山里有座庙,庙里有一个老和尚和一个小和尚,小和尚要睡觉,老和尚给小和尚讲故事..............

    方法自身调用自身(自己调用自己),需要给定一个停止的条件

    递归就是在完成一个隐式的循环

    递归效率很高,占用资源,没有明确前提下不建议写

    一般的递归都使用循环的方式完成

    逆向思维:求和 1~10 之间数的和

    有六个人,第六个人说他比第五个人大3岁

              五             四      3岁

              四             三      3岁

    依次类推:最后一个(第一个人)说自己13岁 求第六个多大

    JVM内存图

     

    JVM内存划分,人为根据不同内存空间存储特点和存储的数据划分

    程序计数器:当前线程执行到字节码文件的行号指示器

    本地方法栈: native方法提供支持(java中某些方法时直接调用c++或C的库来完成)

    虚拟机栈(栈空间):描述java方法执行的内存模型,每个方法执行的时候都会创建一个栈帧,用于存储局部变量(参数列表,在方法体中声明变量),栈的操作,动态链接,方法出站等信息

    堆:被锁有线程所共享的内存区域,在虚拟机启动的时候所创建,所有的对象实例和数组都是分配在堆空间

    (使用new关键字,在堆中开辟空间)

    方法区: 线程共享一块区域.存储着已经被虚拟机加载的类的信息,常量,静态变量,即时编译的一些数据

    Java 数组的定义

    为什么要有数组?

    声明变量的时候每一个单独的变量都需要对应一个变量,但是我们要处理一组比较大的相同数据类型的数据量:

    班级 38名学生,存储所有学生的年龄

    创建38个变量--> 数据类型相同int,38变量的名字

    一次性存储38个值,并且可以方管理 ---> 数组

    数组就是存储着大量相同数据类型的集合,可以方便我们来完成增删改查

    定义数组

    // 定义数组 -->数组中存储的而是相同数据类型

               //1.标准方法

               //数组中元素的数据类型[] 数组名 = new 数组中元素的数据类型[数组中元素的个数];

               //int 不是数组的数据类型 -->数组中元素的数据类型

               //数组的数据类型 --> 数据类型[]

               int[]  age = new int[38];

              

               //2.先声明数组,然后在进行赋值

               //ps:多用于在类中所声明的成员属性(变量)

               //数组是一个引用数据类型,开辟的存储空间是在堆中

               //若使用下面这种方式声明数组,数组声明完后是有默认值的,是null

               int[] age2;         //栈中

               age2 = new int[38]; //堆中

               //3.在声明数组的同时进行初始化

               //需要注意:不能指定数组中存储元素的个数

               //数组会通过赋值的个数,推断出数组中元素的个数

               int[] age3 = new int[] {1,2,3,4,5};

              

               //4.第三中写法的简化版本

               int[] age4 = {1,2,3,4};

              

               //这样也行但是不推荐

               int age5[] = new int[1];

    数组中可以使用的数据类型:

    值类型:

    整数byte,short,int,long 数组中的默认值是 0

    小数float double      数组中的默认值是 0.0

    字符char            数组中的默认值是 u0000 --> 表示空

    ps:是一个不可见的字符,但是不是空格

    布尔 boolean         数组中的默认值是 false

    引用数据类型         数组中的默认值是  null

    ps:在堆中存储的就是引用数据类型

    数组单个元素的访问

    下标:当前数组中元素对应存储的序号

    下标第一是从0开始,数组的长度-1(最后一位)

    数组中元素的个数 == 数组的长度

    语法:

    数组名[下标]

    向数组中某一个元素赋值

    数组名[对应下标] = 对应数据类型的值

    ps:必须满足数组中元素的数据类型所对应的值

    取出数组中某一个元素的值

    数组名[对应下标]

    ps:取出值后,给其他变量或数组进行赋值,当做方法参数传递,进行一些运算符之间的运算

    数组的静态赋值和数组的动态赋值

    数组的静态赋值,就是在创建数组的同时对数组进行赋值

    int[ ] age = {1,2,3,4};

    动态赋值:数组中每一个元素的值都是通过某种方式(输入,随机数,某种计算)得来,动态赋值

    1.Scanner  2.Math.random()

    数组的遍历访问

    第一种:普通for循环

    for(数组中第一个元素的下标;数组长度;下标自增){

    }

    第二种:增强for循环(foreach循环)

    将数组中的元素之取出,然后存储给变量,通过变量就可以看到数组中存储的元素,并且可以做一些操作()

    for(数组中元素的数据类型 变量名:数组名){

    }

    结论:普通for循环即可以对数组进行取值和赋值操作

         增强for循环只能对数组进行取值,不能进行赋值操作

    ps:数组是一个集合(容器),定长的集合(容器)

      数组一旦指定了存储元素的个数,就不能再进行增加或减少

     1 package day04ketang;
     2 
     3 public class MethodDemo {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         int a=(int)(Math.random()*100);
     8         System.out.println(a);
     9         int b=(int)(Math.random()*100);
    10         System.out.println(b);
    11     int max =SelectMax(a,b);
    12     double s=Math.max(12, 99);
    13     System.out.println(s);
    14     int z=addnum(10);
    15     int b1=fun(6);
    16     System.out.println(b1);
    17     }
    18 /**
    19  * 
    20  * @param a 定义一个变量
    21  * @param b  定义一个变量
    22  * @return 返回最大值
    23  */
    24     public static int SelectMax(int a,int b) {
    25         // TODO Auto-generated method stub
    26         if(a<b) {
    27             System.out.println(b);
    28             return b; 
    29         }else {
    30             System.out.println(a);
    31             return a; 
    32         }
    33     // return a>b?a:b;    
    34     }
    35     /**
    36      * 递归调用
    37      */
    38 
    39     public static int addnum(int num) {
    40         if(num==1) {
    41             return 1;
    42         }else {
    43             return num +addnum(num-1);
    44         }
    45     }
    46     /**
    47      *  计算上一个人比下一个人大3岁
    48      * @param a1人数
    49      * @return 年龄
    50      */
    51     public static int fun(int a1) {
    52         if(a1==1) {
    53             return 13;
    54         }else {
    55             return fun(a1-1)+3;
    56         }
    57     }
    58     /**void 型递归
    59      * 
    60      * @param n
    61      * @param x
    62      * @param y
    63      * @param z
    64      */
    65     public static void move(int n,int x,int y,int z) {
    66         if(n==1) {
    67             System.out.println(x);
    68         }else {
    69             move(n-1,x,y,z);
    70         }
    71     }
    72     
    73 }

    数组的排序

    数组排序有很多种:冒泡,选择,插入,快速,堆,归并排序

    冒泡排序:

    排序都是升序排序(从小到大) ,降序(逆序)从大到小

    数组中的元素进行两两相比,大移动到数组的末尾,每次排序完成都会有一个数放到正确的位置

    例子: 9 4 6 3 1

    第一次比较

    数组中第一个元素和数组中第二个元素进行比较,若第一个元素大于第二个元素,交换两个元素的位置,然后继续比较直到数组的最后一个元素

    4 6 3 1 9

    第二次

    数组中第一个元素和数组中第二个元素进行比较,若第一个元素大于第二个元素,交换两个元素的位置,然后继续比较直到数组的最后一个元素

    4 3 1 6 9

    第三次

    数组中第一个元素和数组中第二个元素进行比较,若第一个元素大于第二个元素,交换两个元素的位置,然后继续比较直到数组的最后一个元素

    3 1 4 6 9

    第四次

    数组中第一个元素和数组中第二个元素进行比较,若第一个元素大于第二个元素,交换两个元素的位置,然后继续比较直到数组的最后一个元素

    1 3 4 6 9

    选择排序

    会先固定一个位置,然后依次和后面每一个元素进行比较,若当前固定位置的元素大于后面比较的元素,交换讲个元素的位置,然后继续比较直到数组的最后一个元素为止

     例子:9 4 6 3 1

    第一次:固定数组第一个元素,依次和后面每一个元素比较

    1 9 6 4 3

    第二次:固定数组第二个元素,依次和后面每一个元素比较

    1 3 9 6 4

    第三次:固定数组第三个元素,依次和后面每一个元素比较

    1 3 4 9 6

    第四次:固定数组第三个元素,依次和后面每一个元素比较

    1 3 4 6 9

     冒泡排序:

     1 package day04ketang;
     2 
     3 public class Maopao {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         int[] array= new int[10];
     8         for(int i=0;i<array.length;i++) {
     9             array[i]=(int)(Math.random()*100);
    10         }
    11         System.out.println("排序之前");
    12         for(int i=0;i<array.length;i++) {
    13             System.out.println(array[i]);
    14         }
    15         System.out.println();
    16         for(int i=0;i<array.length-1;i++) {
    17             for(int j=0;j<array.length-1-i;j++) {
    18                 if(array[j]>array[j+1]) {
    19                     array[j+1]=array[j+1]^array[j];
    20                     array[j]=array[j]^array[j+1];
    21                     array[j+1]=array[j+1]^array[j];
    22                 }
    23             }
    24             System.out.println("排序之后");
    25             for(int k=0;k<array.length;k++) {
    26                 System.out.println(array[k]+"	");
    27             }
    28         }
    29     }
    30 
    31 }

    选择排序:

    package day04ketang;
    
    public class Xuanze {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] array= new int[10];
            for(int i=0;i<array.length;i++) {
                array[i]=(int)(Math.random()*100);
            }
            System.out.println("排序之前");
            for(int i=0;i<array.length;i++) {
                System.out.println(array[i]);
            }
            System.out.println("排序之后");
            for(int i=0;i<array.length;i++) {
                for(int j=i+1;j<array.length;j++) {
                    if(array[i] > array[j]) {
                    array[i]=array[i]^array[j];
                    array[j]=array[j]^array[i];
                    array[i]=array[i]^array[j];
                }
            }
            }
            System.out.println();
            for(int k=0;k<array.length;k++) {
                System.out.println(array[k]+"	");
            }
        }
    }
  • 相关阅读:
    js中的内存空间
    MAC升级Nodejs和Npm到最新版
    Linux性能相关工具地图
    ios UILable自包裹
    vue项目使用WebViewJavascriptBridge
    K3Wise后台生成单据编号和单据内码
    解析使用HTTP方式调用金蝶查询单据返回的LIST数据
    jenkins指定构建状态下(构建失败),发送通知到企业微信群 Duke
    MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)") Duke
    jenkins主题简单美化 Duke
  • 原文地址:https://www.cnblogs.com/lijun199309/p/9415456.html
Copyright © 2020-2023  润新知