方法的详细解释

方法(Method)概念

* 某段同样的功能代码段只需呀写一遍

* 要使用这个功能 我们只要给他某些参数值  

* 它就能给我们返回一个结果

这样提高了代码的复用性 使得代码可以重复利用


方法的本质

就是一段代码片段 可以完成某个特定的功能,并且可以重复使用


使用方法

称为调用方法


方法的编写

方法定义在类体中,一个类体中可以定义多个方法,没有先后顺序,不能在方法中又定义方法,方法体中的代码有先后顺序

方法体由Java语句构成,方法体中的语句遵守自上而下的顺序执行


方法定义

格式:

 [修饰符列表] 返回值类型 方法名 (形式参数列表){

  方法体;

 }

解释:

 修饰符列表

  * 可选项,不是必须的

  * 目前统一写成pubic static 别问我为什么 滚 【后面老子就晓得 了】

  * 方法的修饰符列表当中有static关键字的话,怎么调用这个方法

   —— 类名.方法名(实例参数列表)

 返回值类型

  * 什么是返回值 就是方法的结果

  * 就是方法返回结果的类型

   ——类型可以是java任意类型数据 或者是引用类型

  * 没有返回值类型就是void

  * 没有按照所设置的类型返回数据 编译器就报错

  * 若规定的返回值类型不是void 那么方法体最后必须返回一个值 否则编译出错

 返回值语句

  return 值   值的类型必须和定义的返回值类型一致

 结束方法执行

  只要带有return的语句执行 那么return所在的方法结束

 方法名

  * 只要是合法的标识符就行

  * 最好见名知意

  * 最好为动词

  * 方法名首字母小写 后面每个字母首字母大写

 形式参数列表:简称形参

  * 形参是局部变量

  * 形参的个数可以是多个

  * 在方法调用的时候实际给这个方法传递的参数叫做实际参数 简称: 实参

  * 形参其决定性做的是数据类型

  * 形参和实参必须满足数量相同数据类型对应相同

  * 多个形参用逗号隔开


在同一个作用域中return语句下面不能编写任何代码 因为这些代码永远执行不到 编译会报错



return出现在设置为返回值为void的方法中主要是为了结束方法的执行


if的每一个分支代码块也是一个作用域


方法的返回值对于调用它的人来说可以选择接受也可以选择不接受

大多数都接受  

定义接收返回值时,如果创建变量对它进行储存该变量的数据类型必须和返回值数据类型一致(废话)


方法体内的代码句是有顺序的遵循至上而下的顺序执行

比如执行到了第100行 只有在100行完全执行完毕后才会执行101行


建议在一个java源文件只写一个class


方法的调用

方法只创建不调用是不会执行的

语法规则: ( 在修饰符列表有static关键字的时候 )

 —— 类名.方法名(实参列表)   调用某个类当中的某个方法  传递这样的实参

 有时候类名可以省略 在m1方法和m2方法在同一个类体当中的时候就可以省略




JVM中有三块主要的内存空间

1. 栈内存 (在方法调用的时候给方法分配活动区域)

 压栈/入栈/push

 弹栈/出栈/pop

 调用方法就压栈 结束方法就弹栈  

 ----- 栈是一种数据结构 遵循先进后出 后进先出  因为代码都是一行一行执行的

         栈顶元素和栈底元素  栈帧一般都指向栈顶元素 一般栈底元素都是main 当main发生弹栈后程序就结束了

2. 堆内存

3. 方法区内存(存放代码片段 将字节码文件装载到此区域)





方法重载

大概

 好处就是让程序员在调用几个功能相同的方法的时候就像在调用一个方法一样

 如果不使用方法重载就会让让程序员同时记忆多个方法名


 重载就是把几个功能相似的方法的名字设置成一样的 这时候java虚拟机就利用方法的形参数据类型来区分不同的方法

 前提是功能基本相同且形参数据类型不完全相同

怎样构成了方法重载

 1,在同一个类中

 2,方法名相同

 3,参数不同

  -数量不同

  -顺序不同

  -类型不同

方法重载和那些有关系

 和返回值没关系

 和修饰符列表无关

 只和参数列表和参数名有关系



方法递归调用

什么是方法递归

 就是在方法里面调用自身

方法递归很耗费占内存,能不用尽量不用

在递归的时候如果发生

 java.lang.StackOverflowError

 栈内存溢出错误

 错误发生无法挽回,只有一个结果,jvm停止工作

递归必须要要return结束条件,否则必然发生占内存溢出错误

如果递归有return条件那么可以退出递归 在栈内存中只要有方法发生了弹栈 那么该方法将全部弹栈

但是有时候有return条件也可能会发生占内存一处错误,那是因为递归太深

方法的覆盖

什么时候使用方法重写

当父类的方法无法满足子类的需求的时候

子类就可以将父类继承过来的方法进行重写

这个重写的过程叫做方法重写或方法覆盖


什么条件满足方法重写

方法重写只发生在具有继承关系的父子类之间

类结构部分必须一样(返回值一样 方法名一样 形参一样)

访问权限不能更低 可以更高

抛出异常不能更多 可以更少


重写时建议直接复制父类方法 不然容易出错 导致没有覆盖


注意

私有方法不能继承,所以不能覆盖

构造方法不能继承,所以不能覆盖

静态方法不存在覆盖

 【2021/04/28】不存在覆盖是因为静态方法不存在继承

覆盖只针对方法,不谈属性


继承自那个类覆盖的就是谁的方法



方法的重写与异常

前面说过重写的方法不能比父类方法抛出的异常更多更宽


也就是如果父类的方法没有抛出异常 那么子类重写的方法也无法抛出异常 如果父类的方法只抛出一个异常 那么子类也只能抛出一个异常或者不抛出不能抛出比父类更多的异常


然后如果父类抛出的异常时FileNotFoundException 那么子类抛出的异常不能比它广泛 不能抛出IOException 只能和它同级 或者低于 如果同时抛出多个异常不能有任何一个异常比父类异常更广泛