public class Mytemp {
private static int s = 100;
private static String[] ss = {"a","b","c"};
public static void main(String[] agrs){
Mytemp u = new Mytemp();
System.out.println("b-->"+s);
System.out.println("b-->"+ss[0]);
u.change(s, ss);
System.out.println("a-->"+s);
System.out.println("a-->"+ss[0]);
}
public void change(int s,String[] ss){
s=50;
ss[0]="k"; }
}
执行结果:b-->100
b-->a
a-->100
a-->kss[0]的值变了,s的值没有变,请教原因??
private static int s = 100;
private static String[] ss = {"a","b","c"};
public static void main(String[] agrs){
Mytemp u = new Mytemp();
System.out.println("b-->"+s);
System.out.println("b-->"+ss[0]);
u.change(s, ss);
System.out.println("a-->"+s);
System.out.println("a-->"+ss[0]);
}
public void change(int s,String[] ss){
s=50;
ss[0]="k"; }
}
执行结果:b-->100
b-->a
a-->100
a-->kss[0]的值变了,s的值没有变,请教原因??
解决方案 »
- org.apache.jasper.JasperException: java.lang.NumberFormatException:
- 请问,谁有webwork2-spring.jar,发到我邮箱,万分感谢
- 修改完 JSP TOMCAT 就是不编译 重起也不重新编译 在线= 急啊!
- 大家推荐几本spring是经典书
- 一道选择题
- 高薪诚聘java程序员
- websphere上能运行spring框架写的应用吗?
- hibernate+spring+struts validator问题
- 有jdk1.4帮助文档的大哥,给我传一个!邮箱是[email protected] !!!
- 在线等待,谁给我一个高性能的连接池,100相送?
- 做了一个文件导入的功能,英文,数字能正确导入,导入中文确实乱码
- java 开发过著名项目列表
s=50;//此处的s是这个方法的参数s,不是静态变量s。
//Mytemp.s = 50;或this.s = 50;才对,但后者的写法不是很规范。
ss[0]="k";//此处的ss是类静态变量ss的引用地址,通过这个地址进行操作,当然是类静态变量ss受影响
/*
* java方法的参数传递只有值传递,不存在引用传递这个概念,只不过是:
* 八大基本类型直接传值,引用类型传的值是对象的引用地址。
* int是基本类型,int数组是引用类型。
*/
}
个人理解。
基本类型 你这里的int :参数传递的是 该对象的拷贝---这里说拷贝其实是不准确的,看后面的解释。
引用类型 你这里的String[] :参数传递的是 引用的拷贝。这个问题对初学者确实很痛疼。再加上String的不可变性够让人头疼的了。如果你想对这个问题有深入理解的话可以去看看常量池相关的东西,我这里说下我的理解:首先,常量池顾名思义,就是放了一些常用的东西----基本类型和String.这个东西在内存上比较特别是在栈上的,对它里面的东西的读写都比较快,常量池是在编译器初始化的,这也是为了效率。既然说是常量池,那么它里面的东西就具有不可变性,为什么不可变呢,其实主要还是效率的问题。
比如说:int a = 1;
a=a+1;这个操作做了如下的事情:首先 查找常量池中是否有1(像1这样的比较常用的是肯定有的),有就直接把a 指向1 ,没有就在栈中创建。,这些事情是在编译器完成的。a=a+1;这个操作并没有修改a指向的那个1,而是去常量池中找2,如果有就把a指向2,而原来的1还在那里。没有就往常量池中放2.所以
public void change(int s,String[] ss){
s=50;
ss[0]="k";}
这里的s其实也是和
private static int s = 100;
的s指向同一个 常量池中的100,不过当你执行
s=50;时 jvm 并不会去改变原来的100,而是让
private static int s = 100;
中的s重新指向了50.
这个很关键。至于String 数组,就按照一般的去理解就可以了。
所有基本类型(int, long, double, boolean, char, byte .....)是传值,
不过他们也有向对应的封装类,在java.lang中
(Integer, Boolean, Character....).java.lang.String是一个例外,它可以用+,+=两个符号,所以是值引用public class T2 {
public static void main(String[] args) {
int a = 1;
int b = 5;
//operate(a, b);
System.out.println("a=" + a + ",b=" + b);
Integer ab = new Integer("1");
Integer bb = new Integer("5");
ch(ab,bb);
System.out.println("ab=" + ab + ",bb=" + bb);
String abc = "1";
String bbc = "5";
ch(abc,bbc);
System.out.println("abc=" + abc + ",bbc=" + bbc);
int s = 100;
String[] ss = {"a","b","c"};
System.out.println("b-->"+s);
System.out.println("b-->"+ss[0]);
change(s, ss);
System.out.println("a-->"+s);
System.out.println("a-->"+ss[0]);
String sbc = "100";
StringBuffer sb = new StringBuffer("a");
System.out.println("b-->"+sbc);
System.out.println("b-->"+sb);
change(sbc, sb);
System.out.println("b-->"+sbc);
System.out.println("b-->"+sb);
} static void operate(int x, int y) {
x++;
y++;
} static void ch(Integer x, Integer y) {
x++;
y++;
}
static void ch(String x, String y) {
x = x+"00";
y = y+"00";
System.out.println("abc=" + x + ",bbc=" + y);
}
static void change(int s,String[] ss){
s=50;
ss[0]="biek"; }
static void change(String s,StringBuffer ss){
s=s+"1";
ss.append("nihao"); }
}
还有是地址的传递和值的传递是不一样的
ss是地址传递而s是值传递并且
public void change(int s,String[] ss){
s=50;
ss[0]="k";}
这个函数中的s=50;不是赋给了private static int s = 100;
这个s所以s的值不会改变的
一般都是保存都是它的地址。