java学习(四)——方法和参数传递机制

方法

1.方法:完成特定功能的代码块,在C语言中被称为函数
2.定义方法的格式:

		[修饰符] 返回值类型 方法名(形式参数列表)
		{			
					方法体
					[return 返回值;]
		}
	注:1.参数列表中的参数可以有一个或多个,也可以没有参数
   	   2.return 返回到方法调用者,方法调用者也称为这个方法的隐式参数。main()方法是java的虚拟机调用的		
   	   3.在方法体中(或方法声明中)定义的变量叫做   局部变量 。局部变量通常在栈中创建,它的作用域是包含它的块。

方法的重载

方法签名:方法名和参数类型叫做方法的签名
注:返回类型不是方法签名的一部分

在同一个类中,允许存在一个以上的同名方法,它们的参数个数和参数类型不同。这种现象就叫做方法的重载
注:1.方法的重载与其返回值类型无关,只与参数类型和参数个数有关
2.在调用过程中,虚拟机通过不同的参数列表区别同名方法,并调用相应的方法,这个过程叫做重载解析

public class Function
{
	public static int sum(int a,int b){
		return a+b;
	}
	//该方法重载了上述sum(int a,int b)方法
	public static int sum(int a,int b,int c){
		return a+b+c;
	}
	//该方法重载了上述sum(int a,int b)方法
	public static String sum(String a,int b,int c,int d){
		return a+b+c+d;
	}
	public static void main(String[] args)
	{
		System.out.println(sum(1,2));
		System.out.println(sum(1,2,3));
		System.out.println(sum("Hello",1,3,5));
	}
}

运行结果
在这里插入图片描述

#### 基本数据类型做参数 和 引用数据类型做参数 的区别
当形式参数是基本数据类型时,调用方法实际上是把实参拷贝一份赋给形参,形参的改变不影响实参的值。
当形式参数是引用数据类型时,调用方法实际是把实参的地址拷贝一份赋给形参,形参的改变会影响到实参的值。

2018.11.2日修改:起****************************************************************************************

将实参传递给方法(或函数),一般有以下几种
1.按值调用:表示方法接受到的是调用者提供的值。
2.按引用调用:表示方法接受的是调用者提供的变量地址。
3.按名调用(已不在使用)

java采用的是按值调用,也就是说,无论实参是基本数据类型还是引用数据类型,方法接受到的都是调用者提供的值(即把实参的值拷贝一份传递给形参)。那为什么在使用基本数据类型和引用数据类型时造成的结果不同呢?

基本数据类型的实参存储的是基本数据类型的值,而引用数据类型存储的对象的引用(即对象在堆内存中的地址)。当引用数据类型的实参传递给方法时,由于形参和实参都引用了同一个对象,所以修改形参引用对象的值就会影响到实参引用对象的值, 而基本数据类型并没有共同的引用,所以形参的变化不会影响到实参的值。
同时,由于是按值传递的。修改形参的引用并不会影响到实参的引用

public class FunctionTest
{
	public static void main(String[] args)
	{
		//基本类型做参数
		Function t1=new Function();
		//调用前
		int a=3;
		System.out.println("调用前:a="+a);
		t1.printA(a);
		//调用后
		System.out.println("调用后:a="+a);

		//引用数据类型做参数
		Demo d1=new Demo();
		//调用前
		d1.age=16;
		System.out.println("调用前:年龄age="+d1.age);
		
		t1.show(d1);
		//调用后
		System.out.println("调用后:年龄age="+d1.age);
	}
}
class Demo
{
	int age;
	public void show()
	{
		System.out.println("年龄age="+age);
	}
}
class Function
{
	public void printA(int a)
	{
		a=10;		
		System.out.println("printA中修改a后:a="+a);
	}
	public void show(Demo s)
	{
		s.age=45;
		s.show();
	}
}

运行结果
在这里插入图片描述
那么按引用调用是什么样子的呢?(可能大概差不多(~ ̄▽ ̄)~ 如下):

#include<stdio.h>
typedef struct {
    char name[10];
    int no;
}Student;
void swap(Student *b,Student *a)
{
    Student p=*a;
    *a=*b;
    *b=p;
}
int main()
{
    Student s1={"叶叶",10};
    Student s2={"花花",8};
    printf("s1的姓名:%s,编号:%d\n",s1.name,s1.no);
    printf("s2的姓名:%s,编号:%d\n",s2.name,s2.no);
    swap(&s1,&s2);
    printf("s1的姓名:%s,编号:%d\n",s1.name,s1.no);
    printf("s2的姓名:%s,编号:%d\n",s2.name,s2.no);
}

运行结果
在这里插入图片描述
2018.11.2日修改:终****************************************************************************************

String 类型做参数

String是引用数据类型,在调用方法时传递的是地址。但是在方法中改变形参的值并不会影响实际参数的值。如下

主方法把str的地址传给形参pstr,当printStr()方法中的pstr改变时,实际上是新创建了一个字符串“花花”,然后让pstr指向它(而主方法中的str的指向没变),并没有在原来的指向上进行修改。所以String类做形参时,虽然是传递地址,但是形参的变化不会影响实参的值。

public class FounctionTest
{
	public static void printStr(String pstr)
	{
		pstr="花花";
		System.out.println("方法中的pstr="+pstr);
	}
	public static void main(String[] args)
	{
		String str="叶叶";
		//调用方法前
		System.out.println("调用前str="+str);
		
		printStr(str);

		//调用方法后
		System.out.println("调用后str="+str);
	}	
} 

运行结果
在这里插入图片描述

返回目录

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章