6-方法

方法

  • 概念:方法是一个功能的抽取(函数,功能)
  • 好处:降低了程序的冗余度,提高了代码的复用性。隐藏了功能的实现细节
  • 定义
    • 格式
      修饰符 返回类型 方法名(参数列表){
      方法体
      return;
      }
    • 修饰符:固定是public static
    • 返回类型:当一个方法运行完毕之后是否得到一个具体的结果返回给调用者
    • 方法名:方法的名字,见名知意
    • 参数列表:功能执行时需要的一些基本内容
    • 方法体:具体功能的实现
    • return:结束方法,返回结果的关键字。return后面的代码永远不会被执行。return可以结束main的方法销毁main。
    • 方法不可以嵌套,所以方法也不能写在main里面
      如果方法写在main方法里边,一方面使main方法过长,可读性很差;另一方面,方法不能重复使用,而且写在main方法里边的方法必定会加载,不灵活,写在外边的话,什么时候想调用就调用,好处是显而易见的

      参数列表、返回类型和方法体的关系

      理解成:
    • 方法:工厂
    • 参数列表:原料
    • 返回类型:产品

      方法的分类

  • 无返回的方法
    • 方法可以执行具体的功能,但执行完毕后没有返回值,这类方法的返回类型都是void
  • 有返回的方法
    • 方法在执行完具体功能后,会将结果返回给调用者,这类方法的返回类型是具体的某种类型

使用

  • 调用格式:
    方法名(参数列表);

参数列表

写在括号内的列表

  • 分类
    • 形式参数:
      形参,在方法的定义中,作用是告知调用者,方法的执行,需要哪些类型,需要多少参数,形参的变量名是可以任意的,请遵循规范
    • 实际参数:
      实参,在方法的调用中,是真正参与运算的数据

问:参数的类型有哪些?
答:参数的类型可以是任意的,如果是基本数据类型,传递的是值;如果是引用类型传递的是地址值

值传递和地址传递(基本数据类型和引用数据类型)

  • 值传递:传递的数据是基本数据类型,形参的作用域是在当前方法中的,随着方法的释放(出战)会被释放。值传递只是把值传给了它,相当于是赋值,只是拷贝了一份给它。
  • 引用传递:传递的是引用数据类型的地址,引用数据类型创建出的内容都会在堆中存在,不会随着栈中方法的释放(出栈)而释放。因为传递的是地址,修改的是内存中的原始数据(用new声明的都是引用类型,基本类型就八种)。但是也是要返回值的。
  • 所以:基本类型改不了,引用数据类型会改变。基本类型是值传递,引用类型是地址传递可以改变。基本传递的是值,引用传递的是地址。

    大概理解:
    我想要的是拿到地址后,一顿操作后不用return返回值给外面。而是直接就拿到地址修改它的原始数据不用返回。这要求很高的生命周期,如果生命周期不够,就会导致虽然拿到了地址获得了数据,但是不是实时的修改,最后方法运行完毕变量就消亡了,没有给原始数据进行改动。无论是值传递还是引用传递,都是有生命周期的。所以即使是引用传递不用返回值但是它非常怕生命周期不够,因此要写在静态类型中,这样静态方法生命周期非常长。但是静态方法不能访问成员变量,因此只能静态对静态的使用,比如main函数调用静态函数。原因就是引用形参也有生命周期,当方法死亡引用也会死亡,想要直接修改的就是内存中的原始数据只能是方法的生命周期不小于被操作的,要等于或者大于。比如类中的方法可以无返回的操作引用类型。静态方法可以无返回的操作main函数里面的变量。
    比如:sort方法就是典型的修改原始的数组数据排序。类中方法的就远原则也是获取类中的直接修改。

可变参数

格式:
方法(数据类型...变量名){};

特点:

  1. 参数个数可以是任意的
  2. 可变参数的本质是数组,和数组重载不行。
  3. 可变参数必须出现在参数列表的末尾
    就是一个数组,可以把他当吃数组来使用。但是传入参数的时候要当成方法来使用。

返回类型

概念:表示当方法运行完毕后,会将结果通过return关键字返回给调用者。

  • 关键字return
    • 功能
      1. 将方法的结果返回给调用者,返回的结果可以是表达式
      2. 结束方法的作用:当方法无返回值的也可以写return作为结束方法。但是return不能写任何东西。return;
    • 注:
      1. 如果方法的返回类型是void,在方法的末尾处有一个隐式的return来完成方法的结束,此时return后不能有数据,应该直接分号结束。
      2. 如果方法的返回类型不是void,那么方法必须有return执行方法的返回,并且return后必须跟上范围小于等于返回类型的结果。
      3. return之后不能再有语句

方法的重载

概念:在同一个类中,多个方法具有相同的方法名,且参数列表各不相同就形成了方法的重载
特点:

  1. 方法名相同
  2. 参数列表不同(个数不同、类型不同、顺序不同),总之就是只要参数列表看着不一样就行。但是形参名称不一样不算(因为型参的名称可以随意),顺序不一样不算,不然一调用就报错。

好处:
只需要明确想要执行的功能,就能找到对应的方法,而不需要针对相类似的功能而去记忆各个方法名不同的方法。

成员变量和局部变量

成员(全局):定义在方法外,类中的内容。main也是方法,定义在类中并且要在main外,main里面的内容也是局部的。
局部:定义在方法内的内容,mian内的也是局部。
注:

  1. 变量的使用范围是在它所定义代码段中,成员内容能在当前类的任意位置使用,局部内容只能在它所在的方法体中使用。
  2. 就近原则:方法中使用变量时,优先使用本方法中定义的内容,本方法中如果没有该变量,则使用成员的,如果成员中也没有定义则编译失败。近的比远的更快。局部的比外部的优先级高。

区别:

  1. 定义位置不同,成员在类中,局部的在方法中
  2. 默认值不同,成员的默认值是0。局部的什么都没有,一旦调用就报错,所以要初始化。
  3. 使用范围不同,成员的可以在本类中使用,局部的只能在所定义的方法中使用。
  4. 内存中的存储位置不同,成员存在堆中(因为成员的在类中,而类是new的,在堆中,所以在堆中),局部在栈中(因为方法在栈中)。
  5. 内存中的存活时间,生命周期。局部从入栈到出栈。成员的从加载到内存到被垃圾回收器回收掉。

额外

  1. new 都会在堆中开辟空间,传出地址,堆中不常用的内容会被清理。堆中存放的是数据值。
  2. 栈中存放的是方法,采用先进后出。main先进最后出,main调用的方法执行完毕后会弹出。
  3. stack overflower就是方法持续运行不被释放并且还有别的方法加入,导致栈中的方法越来越多,超出内存范围了。
  4. 为什么在类中都使用static来修饰方法?因为我们没有学到对象。使用static修饰的成员可以直接用类调用,也可以用对象调用。但是不用static修饰的成员是能使用对象调用。因为没有学到对象,所以老师使用static来修饰直接在当前类中调用,连类名这个前缀都省了。

注意

  1. 方法中传入数组传入的是地址,只要把数组名放进去就可以了。
  2. 返回值是数组,那么返回类型就要定义成int[]这种数组类型。
  3. 静态成员只有类消亡才会消亡。
  4. 方法定义的位置是任意的,但不能在类外,不能嵌套。
  5. 方法的执行,只有被调用时才会进入栈中,用完弹栈,不用不调。

猜你喜欢

转载自www.cnblogs.com/macht/p/11547561.html