/*
* 函数的参数分为形参和实参两种。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
* 形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
函数的形参和实参具有以下特点:
1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
JAVA传递参数有两种方式:值传递和引用传递。值传递是传递数据,引用传递是把形参和实参的指针指向了堆中的同一对象 */
public class NumChange { public static void main(String[] args) {
// 第一种情况传入数组到方法
int[] a = { 80, 89, 90 };
swapa(a);
for (int i = 0; i < a.length; i++) {
System.out.println("*" + a[i]);
}
// 第二种情况传入基本数据类型到方法
int[] b = { 80, 89, 90 };
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] < a[j]) {
swapb(b[i], b[j]);
}
}
}
for (int i = 0; i < b.length; i++) {
System.out.println("#" + b[i]);
}
// 第三种情况传入字符串对象到方法
String[] c = new String[3];
c[0] = new String("hello");
c[1] = new String("world");
c[2] = new String("hehe");
swapc(c[0], c[1]);
for (int i = 0; i < c.length; i++) {
System.out.println("$" + c[i]);
}
} public static void swapa(int[] a) {
int temp;
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] < a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
} public static void swapb(int m, int n) {
int temp;
temp = m;
m = n;
n = temp;
} public static void swapc(String m, String n) {
String temp;
temp = m;
m = n;
n = temp;
}}
* 函数的参数分为形参和实参两种。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
* 形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
函数的形参和实参具有以下特点:
1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
JAVA传递参数有两种方式:值传递和引用传递。值传递是传递数据,引用传递是把形参和实参的指针指向了堆中的同一对象 */
public class NumChange { public static void main(String[] args) {
// 第一种情况传入数组到方法
int[] a = { 80, 89, 90 };
swapa(a);
for (int i = 0; i < a.length; i++) {
System.out.println("*" + a[i]);
}
// 第二种情况传入基本数据类型到方法
int[] b = { 80, 89, 90 };
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] < a[j]) {
swapb(b[i], b[j]);
}
}
}
for (int i = 0; i < b.length; i++) {
System.out.println("#" + b[i]);
}
// 第三种情况传入字符串对象到方法
String[] c = new String[3];
c[0] = new String("hello");
c[1] = new String("world");
c[2] = new String("hehe");
swapc(c[0], c[1]);
for (int i = 0; i < c.length; i++) {
System.out.println("$" + c[i]);
}
} public static void swapa(int[] a) {
int temp;
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] < a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
} public static void swapb(int m, int n) {
int temp;
temp = m;
m = n;
n = temp;
} public static void swapc(String m, String n) {
String temp;
temp = m;
m = n;
n = temp;
}}
解决方案 »
- 请教一个java GUI的问题,十分感谢!
- java如何打开一个带有IP地址的文件
- JTable中行时间触发问题?
- 菜鸟求助
- 关于JList和JScrolPane的问题,请多多指点
- 请教一个关系时间日期格式的转换格式化的问题~~!!谢谢了!
- 如何将tree自动展开
- 弱弱的求助--98下的JDK 1.4.1,怎样安装,设置路径,环境变量等..
- 紧急!如何把一个用java写的软件包编译?就象c++的 makefile一样?
- 求解,输入一个整形数字,小于等于4位,判断为几位数,并输出各个位数的数字,用chack方法
- java新手求助:Integer.valueOf(k)是什么?有什么作用
- JNDI到底是什么????
有引用传递吗
引用传递吗
用传递吗
传递吗
递吗
吗
但楼主的理解也不能说是错的
楼主说的引用传递,在java里都被理解为值传递
java里认为那个是把对象在堆中的地址值传过去了
java刚开始的时候,除了基本类型的参数传递叫值传递外,其他类型的也都叫引用传递(有java旧版教材的都应该看到过),只是最近不知道什么原因,开始有鼓吹没有引用传递了
其实,引用传递一开始是针对C的引用类型而言的,引用传递以外,有值传递和地址传递两种(即传值和传址),因为引用传递和地址传递都能达到改变形参外的实参的效果,所以,慢慢的地址传递也开始被很多人叫为引用传递。
形参的形就是一种所谓的形式,只是用于辅助说明函数的参数的类型,并没有实际的值,当函数被调用时,函数栈产生,形参也就存在于该栈的数据区(其实就是一个相对地址),当函数调用结束,栈撤销,形参也没了。实参是函数调用时实际传给函数的参数,值传递时,实参的值被复制到函数栈的形应的形参的数据区的地址里,地址(引用)传递时,实参的地址被复制到函数栈的形应的形参的数据区的地址里,函数对形参的操作,只是针对与数据区的那个形参的地址而操作,值传递时,因为修改的是形参地址的内容,所以不会对实参产生影响,地址(引用)传递时,修改形参的属性,并不是直接就把形参的地址里的内容覆盖(因为形参地址里存的只是个地址,没有什么属性),而是先从形参地址里取出里面的内容,即形参和实参共同指向的地址,然后再对那个地址进行操作,这样,因为实参也指向那个地址,所以实参的属性也会发生改变。对于重新给形参赋值,这时是在形参的地址里重新存入一个新的地址,此时形参与实参不再指向同一个地址,所以形参的任何变化都不会对实参造成影响。这也就是为什么在函数里不能改变实参的指向的原因。
之前只是知道,java的引用传梯是封装了,用的多还是值传递
public static void main(String[] args) {
//java参数传递只有值调用,没有引用调用。
Student s1 = new Student(1,"dai");
Student s2 = new Student(2,"kai");
s1.print();
s2.print();
swap(s1,s2);//如果是引用调用的话s1与s2就应该是交换了。
s1.print();
s2.print();
changeName(s1);
s1.print();
}
public static void swap(Student s1,Student s2) {
Student temp = s1;
s1 = s2;
s2 = temp;
}
public static void changeName(Student s) {
s.setName("New Name");
}
}
class Student {
private int number;
private String name;
public Student(int number, String name) {
this.number = number;
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void print() {
System.out.println("number:" + number + " name:" + name );
}
}然后String又有不变性。引用与对象的概念。