方法-Method


方法 - Method

非常重要,如果没有跟上,直接出局.

相当于其他语言中函数function,功能是用来封装代码的逻辑.

把一段代码封装到方法中,方便以后复用,提高了代码的可维护性.

语法

修饰符 返回类型 方法名([参数列表]) [throws 可抛出的异常列表]{..方法体...}

现阶段:
修饰符 返回类型 方法名([参数列表]){..方法体...}

修饰符

访问修饰符

作用:就是决定了这个方法可以被调用的范围.

  1. public - 公开的,公共的.如果一个方法被public进行了修饰,那么代表这个方法可以在别的地方被调用.
  2. private - 私有的,只能在当前类内部被调用 - 体现了”封装性” - 不对外公开的.
  3. 默认的
  4. 受保护的

特殊修饰符[超纲的内容]

  1. static - 静态的

    如果使用static修饰的方法 - 静态方法

    如果没有使用static修饰的方法 - 非静态方法

  2. 是否为静态的方法决定了这个方法被调用的方式.

返回类型

  1. 有返回类型

    可以是八种基本数据类型,也可以是对象类型[内置对象类型或者自定义对象类型]

    方法体的最终的出口一定有return 返回值.

    return 作用1 - 返回方法最终的执行结果
           作用2 - 用来结束整个方法
    
    正常情况方法的返回类型是什么,返回值的结果的类型也应该是什么
    非正常情况 - 支持类型的自动转换和强制类型转换的.
    
    调用的时候 - 需要使用数据类型和变量来接受这个方法调用的结果.
               方法的返回类型是什么,就用什么类型去定义.当然也是支持类型的转换
    
  2. 无返回类型 - void

    不需要使用return  + 返回值;
    
    但是void的方法体中也是可以存在return语句.就是用来结束整个方法的.
      
    if(条件){
      //....
      return;
    }
    //...
    
  1. 该如何选择?

    如果某个方法的执行结果可能在另外一个地方被使用到,那么一定要定义成有返回类型

    如果一个方法仅仅是为了输出,只要定义void

    public static int test01(int m,int n){
        //code...
    
  return m和n的最大公约数

 //System.out.println(公约数)

}
//int m = test01(20,12);//m->4

public static int test02(int m,int n){
int 公约数 = test01(m,n);
return mn/公约数;
}
int n = test02(20,12);//n->60=20
12/4=60


方法名

参考变量名的命名规则 - 一模一样

标识符 - 给类,包,变量,方法取的名称

参数列表

  1. 无参列表

  2. 带参列表 - 固定长参数列表

    //此处的age和name就是形参
    public static void add(int age,String name){
      System.out.println(age+":"+name);
    }
    
  3. 可变长列表

    //可变长列表
    public static void sub(int... arr){//[I@330bedb4 - 数组
      for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
      }
    }
    

参数的分类:

  1. 形参 - 定义在方法的参数列表中的参数.目的就是告诉这个方法的调用者在调用这个方法时候需要传入的参数[个数以及类型]

    ​ 没有实际的值的

  2. 实参 - 方法的调用者在调用这个方法的时候传入的真正的参数 - 真正的值的

该如何定义方法

  1. 方法体内部不能够再去定义方法了
  2. main方法仍然是程序的主入口.
  3. 自定义的方法希望能够被调用,那么最终肯定是在main方法中进行调用的

方法的调用方式

取决于这个方法是静态的还是非静态的 - static

package tech.aistar.day02.method;

/**
 * 本类用来演示: 方法的定义
 * @date: 2021/7/16 2:20 下午
 */
public class MethodHelloDemo {
    /**
     * main - 仍然是程序的主入口
     * @param args
     */
    public static void main(String[] args) {
        //类中的方法 - 类里面的成员
        //static - 静态的成员被初始化的时机
        //静态方法什么时候被初始化的? - 当JVM加载类进内存的时候,就会立即给所有的静态的成员分配空间以及初始化
        //在这个阶段,压根就没有对象的概念,只有类.
        //结论 - 静态的成员属于类的,并且初始化的时机有且1次.
        //属于谁,就由谁去调用!

        //1. 调用静态的方法,直接通过类.方法名([参数])
        //类 - 该静态方法所在的当前类
        MethodHelloDemo.sub();

        //non-static -> 非静态的成员被初始化的时机?
        //当遇到创建对象的语法.每次创建对象的时候,都会给各自的非静态成员分配空间以及初始化
        //如果没有创建对象,就不会初始化这些非静态成员.
        //结论: 非静态成员是属于对象的.属于谁,由谁调用.

        //2. 非静态方法 - 通过对象去调用
        //调用哪个类中的方法,就去创建哪个类的对象
        //后面的OO知识点 -> 类名 变量 = new 类名();

        //创建了一个 MethodHelloDemo对象,m就是对象名
        MethodHelloDemo m = new MethodHelloDemo();
        m.add();
    }

    /**
     * 定义了公开的非静态的无返回类型的方法
     */
    public void add(){
        System.out.println("add...");
    }

    /**
     * 定义了公开的静态的无返回类型的方法
     */
    public static void sub(){
        System.out.println("sub...");
    }
}
  1. 静态方法中只能够直接调用静态方法

  2. 非静态方法中可以直接调用非静态方法以及静态方法

  3. 通用的原则 - 类名.静态方法或者对象.非静态方法

  4. 静态方法属于类拥有的,非静态方法属于对象拥有的

  5. 静态的方法是jvm加载类进内存的时候就会立即被分配空间以及初始化,并且机会仅仅只有1次.

    而非静态方法必须是等到创建对象的时候,才会被分配空间以及初始化

package tech.aistar.day02.method;

/**
* 本类用来演示:
* @date: 2021/7/16 2:43 下午
*/
public class StaticDetailDemo {

  //定义了全局变量
  //属性,方法 => 成员
  //非静态的属性
  int n = 10;//等创建对象的时候,才会分配空间和初始化

  //静态属性-初始化的时机优先于静态方法
  static int m = 100;

  public static void main(String[] args) {
      //此时n还未初始化
      //System.out.println(n);//编译错误

      //System.out.println(m);

      //调用test03 - 非静态的
      StaticDetailDemo s = new StaticDetailDemo();
      s.test03();

      System.out.println(s);
  }
  //非静态的
  public void test01(){
      System.out.println("test01..");
  }

  //静态的
  public static void test02(){
      int n = 10;
      System.out.println("test02...");

      //自定义的方法中是可以调用自己自定义的方法的
      //1. 另外一个静态方法test04
      StaticDetailDemo.test04();
      //静态方法中可以直接调用静态方法
      test04();

      //2. 另外一个非静态方法test03
      StaticDetailDemo s1 = new StaticDetailDemo();
      s1.test03();
  }

  public void test03(){
      //static int n = 20;//非静态方法中不允许定义静态的局部变量
      System.out.println("test03..");

      //非静态方法中调用静态方法 - 类名.方法
      //StaticDetailDemo.test04();//ok

      test04();//ok

      //非静态方法中直接调用另外一个非静态方法呢??? - 肯定是需要一个对象去调用.
      test01();//ok

      //实际上省略了一个关键字this

      //this代表的是当前对象
      //当前对象 - 调用该方法[test03]的对象
      //this.test01();
      System.out.println(this);
  }

  public static void test04(){
      System.out.println("test04..");
  }
}

方法调用补充

  1. 方法的调用者和方法的定义者在同一个类中.

  2. 方法的调用者和方法的定义者不在同一个类中,但是仍然在同一个package中.

    只能使用通用的原则类名.静态方法或者对象.非静态方法

  3. 方法的调用者和方法的定义者是存在于不同包下的不同类中.

    必须先通过import关键字进行导包操作.

    使用jdk中的类的时候,除了java.lang包下的不需要手动import,其余包下的都需要先import

  4. 递归算法 - 错误的写法 - 方法内部直接调用自己

private 和 public 该选择使用

public class 牛叉的工具类{
   
  public static void 牛叉的方法01(){
    
    //肯定是会被外面的人调用的...
    //内部的代码的业务逻辑非常负责,由很多小的功能组成的
    小的牛叉方法01();
    //...
    //..
    //...
  }
  
  private static void 小的牛叉方法01(){
    //专门封装了小的功能.
  }
  
   public static void 牛叉的方法02(){
    
    //肯定是会被外面的人调用的...
     //内部的代码的业务逻辑非常负责,由很多小的功能组成的
     小的牛叉方法01();
     //...
     //...
     
     //...
  }
}

文章作者: 码农耕地人
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 码农耕地人 !
  目录