方法(调用内存,overload)

方法调用

  • 本类中调用静态方法可以省略类名.

  • return;终止的是方法,break;终止的是循环。

public static void m(){
  for(int i=0;i<10;i++){
      if(i==5)
         return;  //i==5时,整个m方法结束。
      System.out.println("你好!");
  }
 System.out.println("i");//输出结果为 0,1,2,3,4
}

方法调用的内存模型

  • 方法代码一开始被类加载器加载到jvm中形成.class字节码文件,被放在了jvm的方法区内存中。

    方法在调用的时候在jvm的栈区中分配一块空间,这个过程称为压栈。

    方法执行完后,栈内的空间被完全释放,称为弹栈。

    • (方法内的局部变量也会在这个栈区内分配空间,方法结束,局部变量的空间被释放。这也是为什么局部变量存在作用域的限制,作用域外无法被调用,因为空间已经被释放掉了)

方法重载overload

在同一个类中,功能相似的方法可以使用方法重载,方便记忆。

  • 方法重载的条件

    • 在同一个类中

    • 方法名相同

    • 参数列表不同(个数,类型,顺序不同都称为不同)

  • 方法重载与返回值类型以及修饰符无关。

方法覆盖/重写 override

  • 构成条件
    • 两个类要有继承关系

    • 重写后的方法与父类的方法具有:
      相同的返回值类型
      相同的方法名
      相同的形参

    • 访问权限不能降低

    • 重写之后的方法不能比原方法抛出更多的异常

方法覆盖注意事项:
  1. 方法覆盖只针对于方法,与属性无关

  2. 构造方法不能被继承,所以也不能被覆盖

  3. 私有方法不能被覆盖

4.方法覆盖只针对于“实例方法”,“静态方法”覆盖没有意义。

  • 解释一下:方法覆盖要与多态联合起来才有意义。子类对父类中的静态方法进行覆盖,由于静态方法的调用与对象无关,所以在多态机制中,将子类对象赋给父类引用时,父类引用调的方法在编译和运行 阶段都是自己的,不会在运行时执行子类的方法,这样一来就不是多态了,方法覆盖就失去了意义。

方法调用时的参数传递(值传递与地址传递)

传递规则只有一个:都是将变量中保存“值”复制一份到方法中,这个“值”可以是一个基本数据类型的字面值(例如100,‘张三’),也可以是一个对象的地址(0x1234)。

  • 基本数据类型的参数,属于值传递,方法中对变量的操作不影响原来的值
  • 引用数据类型的参数,属于地址传递,方法中对变量的操作会修改原变量的值(因为传过去的是原变量的内存地址)
posted @ 2021-09-07 20:35  这个世界会好的  阅读(92)  评论(0编辑  收藏  举报