黑马程序员技术交流社区
标题:
关于静态的小程序问题。
[打印本页]
作者:
ok-Prince
时间:
2014-4-9 13:41
标题:
关于静态的小程序问题。
本帖最后由 ok-Prince 于 2014-4-9 18:39 编辑
各位帮忙看看这个程序是怎么走的,为什么结果是4而不是2?
class Cz2
{
public static void main(String[] args)
{
int x = 4;
show(x);
System.out.println(x);
}
public static void show(int x)
{
x = 2;
}
}
复制代码
程序调用了一次show方法,把2赋值给了x,为什么打印的最终结果却是4呢?
作者:
491138002
时间:
2014-4-9 14:06
代码中主函数的show(x)方法其实是show(4)实现的功能只是:4=2,就是把2赋值给4,很明显没有意义,x本身没有改变
作者:
年轻的老头
时间:
2014-4-9 14:08
public static void show(int a) { a = 2; } 换个名字你能看明白吗
作者:
为你而去
时间:
2014-4-9 14:17
这个要理解按值传递与按址传递的区别,按值传递(by value) 适用范围:8种基本数据类型、String对象 特点:在内存中复制一份数据,把复制后的数据传递到方法内部 作用:在方法内部改变参数的值,外部数据不会跟着发生改变 。 按址传递(by address) 适用范围:数组、除String以外的其他所有类型的对象,方法内部改变对象中的值,外部也会跟着改变
作者:
tiuwing
时间:
2014-4-9 14:57
传入到show()方法中的只是变量X的值,在show()方法中,变量x只是用来接收传递进来的变量的值,
其实也就是相当于: int x=4; int y =x; y=2;
你觉得x的值会变吗?在Java只有按值传递。
作者:
斑驳の记忆
时间:
2014-4-9 16:14
在你的class Cz2类中的main()方法和show()方法中的x是不属于同一个变量的,要注意这个x变量的可用范围;而且你采用show(x)传递给show方法的不是变量X 而是变量X的值4;
作者:
Shimano
时间:
2014-4-9 16:43
参数的传递:
和其他变编程语言一样,在定义方法时,就会有参数的传递,方法参数包括圆括号内的常量值、变量表达式、常量。
在定义方法时,方法中的参数成为形式参数(形参),是用来反映参数的类型及其个数的;当我们调用该方法时,
这时的参数成为实际参数(实参)。通过参数的传递,可以将变量的值传递给方法内部进行处理。
Java中参数的传递有如下两种:
1.值传递:
基本类型参数所传递的参数都是基本数据类型,包括数值型,布尔型等。在这种情况下,所有参数的传递都采用值传递的方式。
也就是说,当传递一个参数到方法时,方法获取的只是该参数的一个拷贝,因此方法不会改变参数变量的值,只是使用该变量的值。
2.址传递:
对象引用型参数如果参数传递的是对象引用型参数(即一个对象),则方法获取的是对象的内存地址,因此方法可以改变该对象
中的属性,但是不能改变对象本身。
这只是Java语言特点中内存管理机制造成的。个人感觉通过下边的代码,对于我们初学者先通过理解后记忆即可,后续随着知识的积累,再理解...
public class Demo
{
public static void add(int a, int b)
{
int c = a + b;
System.out.println("c="+c);
a = c;
}
public static void main(String[] args)
{
//定义并初始化a,b
int a = 10;
int b = 20;
//调用方法
add(a,b);
System.out.println("a="+a);
}
}
复制代码
打印结果:
c=30
a=10
由此可见,传递的参数是基本变量类型时,方法是不能改变参数变量的值的。
public class Demo
{
public static void change(String str, char ch[])
{
str = "Changed";
ch[0] = 'C';//将字符‘C’赋值给字符数组中第一个元素
}
public static void main(String[] args)
{
//创建并初始化字符串对象,及字符数组对象
String s = new String("World");
char[] ch = {'H','e','l','l','o'};
System.out.println(s);//打印原始字符串
getCharArray(ch);//打印原始字符串中的元素
change(s,ch);//调用change()方法
System.out.println(s);//打印处理后的字符串
getCharArray(ch);//打印处理后字符串中的元素
}
public static void getCharArray(char ch[])
{
for(int i=0; i<ch.length; i++)
{
System.out.print(ch[i]);
}
System.out.println();
}
}
复制代码
打印结果:
World
Hello
World
Cello
由此可见,使用字符串对象和字符数组对象作为传递的参数,
方法调用后并不能改变字符串对象,但是可以改变字符数组对象变量的内容。
作者:
ok-Prince
时间:
2014-4-9 18:39
大概的意思我懂了,谢谢大家!
作者:
luoyilan222
时间:
2014-4-9 19:26
class Cz2 {
public static void main(String[] args) {
// 首先确定一下你这事定义的局部变量,局部变量只在当前方法中有效
// int x = 4 这个x值在main方法中有效
int x = 4;
show(x);// 这里只是把4拷贝到show方法中的x
// 你如果想要你说的那种效果可以这样做
// 把 show(x);---> x = show(x);同时该show(int x)方法的返回值
// public static int show(int x){
// x = 2;
// return x;
// }
//这样改写之后打印值肯定为2
System.out.println(x);
}
public static void show(int x)// 这个X只在show方法中有效
{
x = 2;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2