18 java方法_1 _方法的定义与调用 _值传递与引用传递

java方法_1 _方法的定义与调用 _值传递与引用传递

方法介绍

  1. Java方法是语句的集合,它们在一起执行一个功能。

    1. 方法是解决一类问题的步骤的有序组合
    2. 方法包含于类或对象中
    3. 方法在程序中被创建,在其他地方被引用
  2. 设计方法的原则 : 方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。

  3. 回顾:方法的命名规则?

    ​ 首字母小写和驼峰原则

package com.wlw.method;

public class Demo01 {
    // main 方法, 程序来管的,在栈的最底层
    public static void main(String[] args) {
        /*int sum = add(1,2);
        System.out.println(sum);*/

        test();
    }

    //加法
    //修饰符 返回值 方法名(参数) //如果想在main中直接使用该方法,要加修饰符static
    public static int add(int a,int b){
        return a+b;
    }

    public static void test(){
        //用 while 或for循环输出 1~ 1000 之间能被5整除的数,并且每行输出三个
        for (int i = 1; i <= 1000; i++) {
            if(i % 5 == 0){
                System.out.print(i + "\t");
            }
            if(i % (5*3) == 0){//换行
                System.out.println();
                //System.out.print("\n");
            }
        }
    }
}

方法的定义与调用

方法的定义

  1. Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段, 一般情况下,定义一个方法包含以下语法:

  2. 方法包含一个 方法头 和一个 方法体 。下面是一个方法的所有部分:

    1. 修饰符 :修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。

    2. 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。

    3. 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。

    4. 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。

      1. 形式参数:在方法被调用时用于接收外界输入的数据。
      2. 实参:调用方法时实际传给方法的数据。
    5. 方法体:方法体包含具体的语句,定义该方法的功能。

      修饰符  返回值类型  方法名  (参数类型 参数名){
          ...
          方法体 
          ...  
          return 返回值;  //如果返回值类型是void,就没有返回值  
      }
      
      package com.wlw.method;
      
      public class Demo01 {
          // main 方法, 程序来管的,在栈的最底层
          public static void main(String[] args) {
      
              //实际参数:实际调用时,传递给方法的参数(1,2)
              int sum = add(1,2);
              System.out.println(sum);
          }
          //加法
          //形式参数:用来定义用的 (a,b)
          public static int add(int a,int b){
              return a+b;
          } 
      }
      
      package com.wlw.method;
      
      public class Demo02 {
          public static void main(String[] args) {
      
              int num = max(10,20); //调用max方法
              System.out.println(num);
          }
      
          //比大小
          public static int max(int num1,int num2){
              int result = -1;
              if(num1 == num2){
                  System.out.println("两个数相等");
                  return 0;//终止语句,如果执行到这,这个方法也就结束了
              }else if(num1 > num2){
                  result = num1;
              }else {
                  result = num2;
              }
      
              return result;
          }
      }
      

方法调用

  1. 调用方法:对象名.方法名(实参列表)

  2. java支持两种调用方法的方式,根据方法是否有返回值来确定:

    1. 当方法返回一个值的时候,方法调用通常被当作一个值。例如:

      int laige = max(30,40);
      
    2. 如果方法返回值是void,方法调用一定是一条语句。

        System.out.println("Hello World!");
      

值传递(java是值传递)与引用传递

一、理解基本类型与引用类型

Java中的数据类型分为两种为基本类型和引用类型。

  1. 基本类型的变量保存原始值,所以变量就是数据本身。

    常见的基本类型:byte,short,int,long,char,float,double,Boolean,returnAddress。

  2. 引用类型的变量保存引用值,所谓的引用值就是对象所在内存空间的“首地址值”,通过对这个引用值来操作对象。

    常见的引用类型:类类型,接口类型和数组类型。

二、值传递和引用传递的理解

  1. 值传递

    在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

  2. 引用传递

    引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

例子:

package com.wlw.method;

public class Example {
	String str = new String("hello");
	char[] ch = {'a', 'b'};
	public static void main(String[] args) {
		Example ex = new Example();
		ex.change(ex.str, ex.ch);
		System.out.println(ex.str + " and");
		System.out.println(ex.ch);
	}
	
	public void change(String str, char[] ch) {
		str = "ok";
		ch[0] = 'c';
	}
}
/*
输出是:
hello and
cb
*/

//因为String是不可变类且为值传递,而ch[]是引用传递,所以方法中的str = "ok",相当于重新创建一个对象并没有改变实参str的值,数组是引用传递,直接改变,所以执行完方法后,char[] ch = {'c', 'b'};
//第5行定义的 ch  与第13行定义的 ch 指向的是同一块内存数据,要变是一起变的
package com.wlw.method;

public class TestMyValue {
    public static void main(String[] args) {
        MyValue m1 = new MyValue();// 此时value属性默认值为0
        m1.value = 100; // 此时设置value属性值为100
        MyValue m2 = m1; // 将mv1的值传给mv2,由于mv1中存储的是对象的首地址,故mv2也指向了相同的对象首地址
        m2.value = 200; // 改变对象的value属性值为200
        System.out.println(m1.value);
        // 结果是200 ,原因是mv1引用和mv2引用指向了同一块内存数据(对象),mv1引用和mv2引用都有修改的权利, 先然数据被mv2引用修改为200。
    }
}

class MyValue{
    int value;
}

三、结论

通过上面的分析我们可以得出以下结论:

  1. 基本数据类型传值,对形参的修改不会影响实参;(值传递)
  2. 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。(引用传递)
  3. String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。(可以看作是值传递)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬浮海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值