黑马程序员技术交流社区
标题:
简单的问题 来看一下!
[打印本页]
作者:
湛添友
时间:
2014-5-16 12:47
标题:
简单的问题 来看一下!
public class J_Test {
String m_kobe = "1";
String[] m_king = {"2"};
public static void main(String[] args) {
J_Test app = new J_Test();
app.mb_operate(app.m_kobe, app.m_king);
System.out.println(app.m_kobe+app.m_king[0]);
}
static void mb_operate(String m_kobe, String[] king) {
//System.out.println(m_kobe);
m_kobe = new String("3");
// System.out.println(king[0]);
king[0] = new String("4");
}
}
为什么结果是14
作者:
来男.
时间:
2014-5-16 15:12
本帖最后由 来男. 于 2014-5-16 15:14 编辑
public class J_Test {
String m_kobe = "1";
String[] m_king = {"2"};
public static void main(String[] args) {
J_Test app = new J_Test();
app.mb_operate(app.m_kobe, app.m_king);
System.out.println(app.m_kobe+app.m_king[0]);
}
static void mb_operate(String m_kobe, String[] king) {
king[0] = new String("4"); m_kobe = new String("3");
}
}
我觉得当m_kobe(1)和m_king(2)作为参数分别投到mb_operate中时,
1、m_king 作为
数组
(也就是king)它的第一个字符串(king[0])被赋值为4;
2、而m_king作为
字符串
是不可能被赋值为3的,这体现了字符串的一大特性:
一旦被赋值,就不可改变了
(不可改变性);
结果为 14。
作者:
波涛
时间:
2014-5-16 16:32
本帖最后由 波涛 于 2014-5-16 16:35 编辑
public class J_Test {
String m_kobe = "1";//全局变量
String[] m_king = {"2"};
public static void main(String[] args) {
J_Test app = new J_Test();//实例化J_Test的一个实例app
app.mb_operate(app.m_kobe, app.m_king);//调用静态方法mb_operate,
System.out.println(app.m_kobe+app.m_king[0]);
}
//当形参为对象或数组时为引用传递, 你可以在调用前和调用后分别打印一下m_king和king看其值是否一样
static void mb_operate(String m_kobe, String[] king) {
m_kobe = new String("3");//<font color="red">m_kobe="3";这个m_kobe是局部变量,其值不影响外部同名变量</font>
// System.out.println(king[0]);
king[0] = new String("4");//<font color="red">注意这里的改变同样影响m_king[0]的值,因为他们指向同样地址,亦即为同一变量。</font>
}
}
复制代码
关于第十行的方法,当形参为对象或数组时为引用传递, 你可以在调用前和调用后分别打印一下m_king和king看其值是否一样
作者:
我为你着迷
时间:
2014-5-16 16:52
看不懂啊
作者:
彭飞
时间:
2014-5-16 23:29
兄兄,
你这个问题,差点把我难道,哈哈
还是被我看破了。
这个程序,首先在执行的时候。
执行的是static 修饰的方法啊。
所以程序运行后,首先,执行的是:
static void mb_operate(String m_kobe, String[] king) {
//System.out.println(m_kobe);
m_kobe = new String("3");
// System.out.println(king[0]);
king[0] = new String("4");
}
复制代码
这个时候m_kobe = new String("3");新指定了一个地址值,是被传递过来的局部变量。
跟class下的m_kobe不是同一个!!! 其实我也不知道这个是全局变量,嘿嘿,
我只是改了个值 String m_kobe = "P"; 放到了main方法下,分解输出看值
发现,p根本就没有出现过,说明没有调用他,这种情况下,只有全局变量这个大哥在的时候,小弟才黯然收场。
king[0] = new String("4"); 是正常的赋值行为。
然后程序由上往下执行代码。全局常量:m_kobe = “1”
app.m_king[0] 是新的数组,
所以他们进行字符串连接的时候会是14
-0- 囧啊,我看了半天。对了,这是我分解你的代码:
class Test9 {
String m_kobe = "1"; //原来丫的全局变量,我也才知道。嘿嘿。
// m_kobe = "p"; //赋值失败。 2个赋值证明丫是全局大哥大。
String[] m_king = {"2"};
public static void main(String[] args) {
String m_kobe = "2";//局部变量,
m_kobe = "3";//成功赋值
Test9 app = new Test9();
app.mb_operate(app.m_kobe, app.m_king);
System.out.println(app.m_kobe);//1
System.out.println(app.m_king[0]);//4
System.out.println(app.m_kobe+app.m_king[0]);//14
}
static void mb_operate(String m_kobe, String[] king) {
//System.out.println(m_kobe);
m_kobe = new String("3");
System.out.println(m_kobe+"----");//3----
// System.out.println(king[0]);
king[0] = new String("4");
}
}
复制代码
作者:
ID1003
时间:
2014-5-17 00:20
额,这段代码我直勾勾的盯了二十分钟,终于明白了是为什么了,记得刘意老师讲过String 是一个特殊的引用类型,在参数传递的时候,把他当做基本类型,而大家应该知道,基本类型在做参数传递的时候其本身是不会变的,所以m_kobe不管做任何操作,其本身就是1,而对于下面那个字符串的数组来说,是对数组中的某个索引位置进行赋值,所以就会变成4,这样来看最后结果就是14,如果输出中这样写的话会更清楚:System.out.println(app.m_kobe+":"+app.m_kingp[0]);
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2