• Java方法


     

    1、方法概念

    Java方法是语句的集合,他们在一起执行一个功能

    • 方法是解决一类问题的所需步骤的有序集合

    • 方法包含于类或对象中

    • 方法在程序中被创建,在其他地方被引用

    设计方法时,要尽量保证方法的原子性,就是一个方法只完成一个功能,有益于后续扩展

    2、方法定义和调用

    2.1、定义

    //语法
    修饰符 返回值类型 方法名(参数类型 参数名){
       方法体
       return 返回值;
    }

    //示例1
    public int add(int a,int b){
       int c = a + b;
       return c;
    }
    //示例2
    public void test(){
       System.out.println("这个方法没有返回值");
    }
    • 修饰符:定义了该方法的访问类型,告诉编译器如何调用该方法,可选

    • 返回值类型:方法可能存在返回值,像示例1,返回一个数据类型为int整形的数据,方法也可能不存在返回值,在这种情况下,返回值类型的关键字为void,如示例2所示

    • 方法名:方法的实际名称,和参数列表共同构成方法签名

    • 参数类型和参数名:两者共同构成参数列表,参数列表是指方法的参数类型,参数先后顺序,参数的个数

      • 参数相当于是一个占位符,可选,当方法被调用时,传递具体的值(实参,参数实际的值)给参数

      • 形参:当该方法被调用时用于接受外界输入的数据

        //这里的a和b就是方法的形参,提前定义好的当该方法被调用时,一个接受外界输入数据的盒子
        public int add(int a,int b)
      • 实参:调用方法时,实际传给该方法的数据

        //该方法被调用时,1传递给了a,2传递给了b
        add(1,2);
    • 方法体:方法体包含具体的语句,定义该方法的功能

    2.2、调用

    //语法
    对象名.方法名(实参列表)
    • Java支持两种调用方法的方式,根据是否有返回值来选择

      • 当方法返回一个值的时候,方法调用通常被当作一个值

        public class Test {

           public static void main(String[] args) {
               //add方法被调用方法调用,结果为一个整型数据
               int add = add(1, 2);
               System.out.println(add);
          }

           public static int add(int a,int b) {
               int c = a + b;
               return c;
          }
        }
      • 如果方法的返回值是void,方法调用的结果一定是一条语句

        public class Test {

           public static void main(String[] args) {
               //noReturn方法被调用,方法没有返回值,所有不用定义变量来接收返回值
               noReturn();
          }

           public static void noReturn() {
               System.out.println("这个方法没有返回值");
          }
        }
    • 值传递和引用传递

      • 基本数据类型作为参数的方法调用

        public class Test02 {
           
           /*
           这里的change方法中,形参是a,实参是b
           实参给形参传递数据的方式为:实参b将值20复制一份给形参a
           实参和形参是两个方法中的相互独立的局部变量,所以修改形参a不会影响实参b的值
           */

           public static void change(int a){
               a = 10;
               System.out.println("a = " + a);//输出结果为:a = 10
          }

           public static void main(String[] args) {
               int b = 20;
               change(b);
               System.out.println("b = " + b);//输出结果为:b = 10
          }
        }
      • 引用类型作为参数的方法调用

        //定义一个Point类
        class Point{
           int x;
           int y;

           public Point(int x,int y){
               this.x = x;
               this.y = y;
          }

           public void show(){
               System.out.println("(x = " + x + ",y = " + y + ")");
          }
        }

        public class TestReferencePassing {

           /*
           这里的change方法中,形参是point对象中的两个属性 x 和 y,实参是change方法中实际赋值给 x 和     y的值。实参给形参传递数据的方式为:实参将直接覆盖修改原先形参的值
            */

           public static void change(Point p1){
               p1.x = 5;
               p1.y = 5;
          }

           public static void main(String[] args) {

               Point point = new Point(1,1);
               //调用change方法前,show()方法的输出结果为(x = 1,y = 1)
               point.show();
               change(point);
               //调用change方法前,show()方法的输出结果为(x = 5,y = 5)
               //说明Point对象中x和y的值已经发生改变
               point.show();
          }

        }

        内存分配过程如下图所示:

    • 基本数据类型的参数传递是值传递,引用类型的参数传递是引用地址,本质上也是值传递,所以Java参数传递的方式是值传递

    3、方法重载

    • 重载就是在一个类中,有相同的函数名称,但形参不同的函数

    • 方法重载的规则

      • 方法名称必须相同

      • 参数列表不同

        • 参数类型不同

          public void add(int a) {}

          public void add(String a) {}
        • 参数的个数不同

          public void add(int a) {}

          public void add(int a,int b) {}
        • 有两个或者之上的不同参数类型的参数的先后顺序不同

          public void add(int a,String b) {}

          public void add(String b,int a) {}
      • 方法的返回类型可以相同也可以不相同

      • 仅仅返回类型不同不足以构成方法重载

    • 实现理论

      方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法

    4、可变长参数

    //语法
    修饰符 返回值类型 方法名(参数类型... 参数名){}

    //示例
    public void vlParams(int x,int... i){}
    • 定义可变长参数后参数的数量不定,根据调用方法时传递的参数数量而定

    • 一个方法中只能指定一个可变长参数,它必须是方法的最后一个参数

    5、递归

    • 方法调用自身

    • 递归结构

      • 边界条件:判断什么时候不再调用自身的条件

      • 前阶段:调用自身

      • 返回阶段:得到最终的一个值,返回给程序

        public class testRecursion {
           public static void main(String[] args) {
               System.out.println(recursion(5));
          }
           //计算 n!(n的阶乘)
           public static int recursion(int n){

               //边界条件
               if (n == 1){
                   return n;
              }else{
                   //前阶段,调用自身n * recursion(n-1);
                   //返回阶段:把值返回给程序
                   return n * recursion(n-1);
              }
          }
        }
    • 栈溢出

      递归没有边界条件就会引起栈溢出错误

      public class testRecursion {
         
         public static void main(String[] args) {    
             //栈溢出错误:Exception in thread "main" java.lang.StackOverflowError
             System.out.println(recursion(5));
        }
         public static int recursion(int n){
             return n * recursion(n-1);
        }
      }

    笔记内容均为自己看大神【狂神说Java】的视频整理的,给狂神点赞

    狂神视频链接

  • 相关阅读:
    矩阵分析 p13~p20
    矩阵分析 p1~p13
    复变函数2
    口语80篇(1-2)
    复变函数1
    背单词方法
    writing practice
    将博客搬至CSDN
    windows内核编程 白话设备栈
    sfliter__except_handler4
  • 原文地址:https://www.cnblogs.com/LittleSkinny/p/12766684.html
Copyright © 2020-2023  润新知