【Java】方法

目录

一、成员方法

二、成员方法使用细节

三、方法的调用

四、成员方法传参机制

     1.基本数据类型的传参机制

     2.引用数据类型的传参机制

五、方法重载

六、可变参数

七、构造方法/构造器


一、成员方法

  1. 提高代码的复用性
  2. 可以将实现的细节封装起来,然后供其他用户来调用即可
  • 成员方法的定义:
访问修饰符 返回数据类型 方法名(形参列表 .. {// 方法体
    语句;
    return 返回值 ;
}

  • 访问修饰符 (作用是控制方法使用的范围)
  1. 如果不写默认访问,[有四种: public, protected, 默认, private],

  • 返回数据类型:表示成员方法输出, void 表示没有返回值
  1. 一个方法最多有一个返回值 
  2. 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
  3. 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return ; 而且要求返回值类型必须和 return 的 值类型一致或兼容;如果方法是 void,则方法体中可以没有 return 语句,或者 只写 return ;

  • 方法名
  1. 遵循驼峰命名法,最好见名知义,表达出该功能的意思即可

  • 形参列表:表示成员方法输入
  1. 一个方法可以有0个参数也可以有多个参数,中间用逗号隔开, 比如 getSum(int n1,int n2)
  2. 参数类型可以为任意类型,包含基本类型或引用类型,比如 printArr(intDl map)
  3. 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型 的参数!etSum
  4. 方法定义时的参数称为形式参数,简称形参:方法调用时的传入参数称为实际参数,简称实参实参和形参的类型要一致或兼容个数、顺序必须一致!

  • 方法主体:表示为了实现某一功能代码块
  1. 里面写完成功能的具体的语句,可以为输入,输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!

  • return 语句不是必须的。

二、成员方法使用细节

  1. 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型 的参数
  2. 实参和形参的类型要一致或兼容、个数、顺序必须一致
  3. 一个方法最多有一个返回值
  4. 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)

三、方法的调用

  1. 同一个类中的方法调用:直接调用即可。
  2. 跨类中的方法A类调用B类方法: 需要通过对象名调用。
  3. 特别说明一下: 跨类的方法调用和方法的访问修饰符相关
class A {
    //同一个类中的方法调用:直接调用即可
    public void aa(int n) {
        System.out.println("aa()方法被调用");
    }

    public void bb() { //bb 调用 aa(直接调用即可)
        aa(10);
        System.out.println("继续执行");
    }

    //跨类中的方法 A 类调用 B 类方法:需要通过对象名调用
    public void m1() {
        B b = new B();//创建 B 对象
        b.hi();//再调用方法即可
    }
}
class B {
    public void hi() {
        System.out.println("B 类中的 hi()被调用");
    }
}
  • 方法调用过程:
  1. 当程序执行到方法时,就会开辟一个独立的空间(栈空间)
  2. 当方法执行完毕,或者执行到return语句时,就会返回
  3. 返回到调用方法的地方
  4. 返回后继续执行方法后面的代码当main方法(栈) 执行完毕,整个程序退出

四、成员方法传参机制

     1.基本数据类型的传参机制

  • 基本数据类型传递的是值(值拷贝),形参的任何改变不影响实参
/**
 *基本数据类型的传参机制
 */
public class MethodParameter01 {
    public static void main(String[] args) {

        int a = 10;
        int b = 20;

        //创建 AA 对象
        M1 m1 = new M1();
        m1.swap(a, b); //调用 swap 将a b 传入swap方法中
        System.out.println("main 方法 a=" + a + " b=" + b);//a=10 b=20
        /*
        m1.swap(a, b);调用时开辟一个新的栈
        新的栈中改变值 而原来栈的值并不变
         */
    }

}

class M1 {
    public void swap(int a, int b) {
        System.out.println("a 和 b 交换前的值 a=" + a + "\tb=" + b);//a=10 b=20

        // a 和 b 交换
        int tmp = a;
        a = b;
        b = tmp;
        System.out.println("a 和 b 交换后的值 a=" + a + "\tb=" + b);//a=20 b=10
    }
}

     2.引用数据类型的传参机制

  • 引用数据类型 = 类、数组、接口
  • 引用数据类型传递的是地址(传递的值是地址),可以通过形参影响实参!
/**
 *引用数据类型的传参机制 数组
 */
public class MethodParameter02 {
    public static void main(String[] args) {
        //创建对象
        M2 m2 = new M2();
        //定义数组
        int arr[] = {1, 2, 3};
        //调用方法
        m2.test(arr);
        System.out.println("main 的数组");

        //for循环输出数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + "\t");
        }//输出 111 2 3
    }

}

class M2 {
    public void test(int[] arr) {
        //将数组下标为0的元素改为 111
        arr[0] = 111;
        System.out.println("test100的arr数组");

        //for循环输出数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + "\t");
        }//输出 111 2 3

    }
}
/**
 * 引用数据类型的传参机制 类
 */
public class MethodParameter03 {
    public static void main(String[] args) {

        M4 m4 = new M4();
        M3 m3 = new M3();
        m3.name = "dd";
        m3.age = 11;
        m4.temp(m3);//将m3 传入m4 中

        //第一种情况 输出22
        System.out.println("main的age=" + m3.age);

        //第二种情况 输出11
        System.out.println("main的age=" + m3.age);

        //第三种情况 new一个新对象 输出11
        System.out.println("main的age=" + m3.age);
    }

}

class M3 {
    String name;
    int age;
}

class M4 {
    public void temp(M3 m3) {

        //第一种情况 输出22
        m3.age = 22;
        System.out.println("改变之后的age=" + m3.age);

        //第二种情况 main的age不改变  m4调用为空是自己指向地址的断开 并不影响原本m3地址的指向
        m3 = null;

        //第三种情况 new一个新对象 输出33
        M3 m31 = new M3();
        m31.age = 33;
        System.out.println(m31.age);
    }
}

五、方法重载

  1. java 中允许同一个类中,多个同名方法的存在,但要求形参列表不一致!
  2. 方法名 : 必须相同(形参类型或个数或顺序,至少有一样不同,参数名无要求)
  3. 返回类型: 无要求
/**
 * 方法重载
 */
public class OverLoad {
    public static void main(String[] args) {

        MyCalculator mc = new MyCalculator();
        System.out.println(mc.calculate(1, 2));//找参数为 两个整数
        System.out.println(mc.calculate(1, 2.1));//找参数为 一个整数,一个double
        System.out.println(mc.calculate(1, 2, 3));//找参数为 三个整数
    }
}

class MyCalculator {
    
    //两个整数的和
    public int calculate(int n1, int n2) {
        System.out.println("calculate(int n1, int n2) 被调用");
        return n1 + n2;
    }

    //没有构成方法重载, 因为int n1, int n2 形参完全相同
    //    public void calculate(int n1, int n2) {
    //        System.out.println("calculate(int n1, int n2) 被调用");
    //        int res = n1 + n2;
    //    }

    //没有构成方法重载,因为不看参数名
    // public int calculate(int a1, int a2) {
    // System.out.println("calculate(int n1, int n2) 被调用");
    // return a1 + a2;
    // }

    //一个整数,一个 double 的和
    public double calculate(int n1, double n2) {
        System.out.println("calculate(int n1, double n2) 被调用");
        return n1 + n2;
    }


    //三个 int 的和
    public int calculate(int n1, int n2, int n3) {
        System.out.println("calculate(int n1, int n2, int n3) 被调用");
        return n1 + n2 + n2;
    }
}

六、可变参数

  • 基本语法
访问修饰符 返回类型 方法名 ( 数据类型 ... 形参名 ) {
}
  1. java 允许将同一个类中,多个同名同功能,但参数个数不同的方法,封装成一个方法。
  2. 可变参数的实参可以为0个或任意多个
  3. 可变参数的实参可以为数组
  4. 可变参数的本质就是数组
  5. 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
  6. 一个形参列表中只能出现一个可变参数
/**
 * 可变参数
 */
public class VarParameter {
    public static void main(String[] args) {

        V v = new V();
        System.out.println(v.sum(1, 2));

        //可变参数的实参可以为数组
        int[] arr = {1, 3};
        System.out.println(v.sum(arr));

    }

}

class V {

    //接收 类型为int 的多个元素
    public int sum(int... nums) {
        int res = 0;
        for (int i = 0; i < nums.length; i++) {
            res += nums[i];
        }
        return res;
    }

    //可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
    public void v1(String str, int... nums) {

    }
}

七、构造方法/构造器

  1. 基本语法:[修饰符] 方法名 (形参列表 ){ 方法体; }
  2. 构造器的修饰符可以默认,也可以是public protected private
  3. 构造器没有返回值
  4. 构造方法名 和 类名 必须一样
  5. 参数列表 和 成员方法一样的规则
  6. 构造器是完成对象的初始化,并不是创建对象,在创建对象时,系统自动的调用该类的构造方法完成对对象的初始化
  7. 一个类可以定义多个不同的构造器,即构造器重载
  8. 构造器没有返回值!
/**
 * 构造方法/构造器
 */
public class Constructor {
    public static void main(String[] args) {
        C1 c1 = new C1("aaa", 11);
        System.out.println(c1.age + c1.name);
        //c1.C1;//错误 (构造器由 系统调用)

        C1 c2 = new C1("bbb");
        System.out.println(c2.name);

    }
}

class C1 {

    String name;
    int age;

    public C1(String name, int age) {
        System.out.println("构造器一被调用");
        this.name = name;//哪个对象调用,this就代表哪个对象
        this.age = age;
    }

    //构造器重载
    public C1(String name) {
        System.out.println("构造器二被调用");
        this.name = name;
    }

    //一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义
    C1() {//无指定构造器 有默认构造器

    }

}
  • 50
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值