当前位置:编程学习 > JAVA >>

关于JAVA基础题目,急急。谢谢

public class A
{
String str=new String("good");
char[] ch={'a','b','c'};
public static void main(String[] ags)
{
A ex=new A();
ex.change(ex.str,ex.ch);
System.out.print("ex.str"+"and");
System.out.print(ex.xh);
}
public void change(String str,char ch[])
{
str="text to";
ch[0]='g';
}
}
请问结果是什么?分析分析。。谢谢,区别要分析清楚些哦,谢谢。
补充:有以下5个疑问:希望得到解答谢谢。1,String str=new String("good");中str是对象还是good是对象,good是值!str是对象。对吗?2,String str=new String("good"); 和str = "textto";前一个str和后一个str应该是同一个吧,如果不是同一个,那为什么要用同样的名字;ex.str和str是同一个意思吗,
		
答案:
//无用的分析我也不写了,
//你程序中有两个地方 写错了,我改回来了。
public class A
{
String str=new String("good");//这是A这个类中的两个成员变量,成员函数写在下面。
char[] ch={'a','b','c'};

public static void main(String[] ags)
{
A ex=new A();//这里是初始化了一个A对象ex咯
//ex.change(ex.str,ex.ch);调用自己的成员函数,传递的是什么呢,ex.str和ex.ch
//关键是在这里,在java中对象作为参数的传递方式是 引用。说白了,就跟C++里的 引用
//是一样的,也就是取的别名。(别名可以理解为指针,只是只用时不用加*字符)
//接着刚才的讲,对象作为参数的传递方式是 引用,是这样的过程:
//形参str是实参ex.str的引用,也就是str指向了ex.str所指的对象
//java中取消了指针,数组也是对象,对象的赋值,参数传递也是引用,当然跟String是一回事了

//现在看你的成员函数,你的成员函数使用的形参str,和ch 都是局部变量覆盖了成员变量,
//所以在成员函数中使用的str和ch都是形式参数,跟你A类的成员变量,没有直接的关系
//那成员函数中 ,str和ch 是什么呢,上面我说了,是ex.str和ex.ch的引用。就是指向了
//ex.str和ex.ch所指的 对象(为什么ex.str是指向对象的,我下面有解释)。
//现在对str 和ch 的对象操作都是对 实际参数的操作。


//现在先说其它两个知识点,也可以说是一个知识点,就是在java中,
//1、除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。
//2、在1中任何使用 "="向对象变量赋值 ,也包括 new 创建对象的时候。我上面说ex.str指向的对象,
//就是这个意思,ex.str本身也是个 引用。


//好了,该说的都说了,分析你程序应该就没有疑惑了。
//str="text to";这是 让形参成为"text to" 的引用,指向这个对象,而不指向 ex.str了,所以ex.str没有改变。
//ch[0]='g'; 这个不是 用"="向对象变量赋值的 情况, 只是普通数据类型 的赋值,并不是引用。
//是吧,ch所指的ex.ch所指的对象,ch[0]的改变也相应的改变了 ex.ch[0] 了啊。



System.out.print(ex.str+"and");//你的原本 意思是不加 引号的吧。
System.out.print(ex.ch);//你的原本意思是 ex.ch吧。
}
public void change(String str,char ch[])
{
str="text to";
ch[0]='g';
}
}

//好了 ,按照这个程序的输出,就是 goodandgbc 了。


//我想 我写了这么多,应该就是最佳答案了。 ^.^=)!
答案补充
针对你的问题补充,我来回答一下:
1、对,good是初始化str为String的对象的值。
2、前一个str和后一个str应该是同一个吧,答案是 不是。
为什么要同名 ,这个嘛,若是题目的话,就是要迷惑 解题的人,看解题者是否真的弄清楚 了概念。
ex.str和str是同一个意思吗,回答是 不是,为什么,我分析中有讲。
你的问题补充你说有五个,但只看的到2个,相信看了我分析后,其它有关问题也都可以解决的吧。@_@
就你2个问题补充而言,觉得你基础不好,应该看些C/c++方面的基础知识,也就是java的基础知识,只是有些java的书,都没有写了,或写的太略了。
2楼的说法是不正确的,change方法的第二个参数传递进去的也是引用~之所以改变了值,是因为ch[0] = 'g';直接改变了局部变量ex.ch,和成员变量ch所指向的同一个数组的第一个元素~
而str = "text to"只是改变了局部变量str这个引用,让他指向了另外一个对象"text to",
而没有改变成员变量所指向的对象~~
答案补充
夜¢无痕和凌风的说法都有问题~~
我把程序做下改动。大家就明白是怎么回事了~
修改如下:
public class A
{
String str = new String("good");

char[] ch = { 'a', 'b', 'c' };

public static void main(String[] ags)
{
A ex = new A();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + "\t");
System.out.print(ex.ch);
}

public void change(String str, char ch[])
{
str = "text to";
//ch[0] = 'g';

char[] ch1 = { 'd', 'e', 'f' };
ch=ch1;
}

}
运行结果:goodabc
那个字符数组成员变量:ch的值并没有改变~~
答案补充
1.str是对象的引用~"good"是那个对象~严格的说,字符串都是存储在字符串池中的
2.前一个str是该类的成员变量,后一个str是change方法中的局部变量,同一个名字不一定就是同一个东西,就好比人的重名现象~ex.str调用的是成员变量~
public class A{
String str = new String("good");//初始化全局变量
char[] ch = { 'a', 'b', 'c' };//初始化全局变量

public static void main(String[] ags) {//A类的入口
A ex = new A();
ex.change(ex.str, ex.ch);//调用方法
System.out.print(ex.str + "and");//打印输出--- 此处 我想 你是这样想的 System.out.print(ex.ch);//输出字符数组即ex.ch--- 此处 我想 你是这样想的
}

public void change(String str, char ch[]) {
str = "text to";//将传入的str赋值
ch[0] = 'g';//覆盖ch[0]为'g'
}

}
答案goodandgbc
输出结果应该是:ex.strandgbc
分析:这个题目主要考察的是Java语言中数据作为方法参数传递时的问题,如果LZ学过C++,那么就不难
明白,这里传递过去的是数组的存储地址,所以修改会影响到原来的值,而对于String传过去的
只是一个引用,所以修改不会改变原来的值!
答案补充
如果题目如楼上所改,LZ的真实意图是     System.out.print(ex.str+"and");
System.out.print(ex.ch);
那么结果就是goodandgbc,但是原理还是一样的,程序设计要经常上机运行!
 ex.str  and gbc      ex.change(ex.str, ex.ch);//调用change()方法        System.out.print(ex.str + "and");//打印输出      
str = "text to";//这个是作为值传入的 但是你上面方法里第一个参数是ex.str所以 这里的str没有起到任何作用 ch[0] = 'g';//覆盖字符数组的第一个下标值为'g' }}
答案补充
  good是变量 变量都是存储在内存快中的 public void change(String str,char ch[])
{
str="text to";
ch[0]='g';
}
这方法里面的 str只是这个方法里面的参数 JAVA都是值传递 所以 ex.str 跟 change()方法里的str不是同一意思 可以这样说 change()里面的str只是作为局部变量
你写的程序有问题,应该是:
public class A
{
String str=new String("good");
char[] ch={'a','b','c'};
public static void main(String[] ags)
{
A ex=new A();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+"and");
System.out.print(ex.ch);
}
public void change(String str,char ch[])
{
str="text to";
ch[0]='g';
}
}

结果是:goodandgbc

下面是分析:首先要了解字符串的不变性,不变性就是字符串一旦声明,就不可以改变了。

例如:String str="abc";
String str1="ab"+"c";
str==str1 是false 说名是两个对象。

String str=new String("good"); 定义一个字符串对象good,永远不会改变。
char[] ch={'a','b','c'}; 定义一个字符数组。


public void change(String str,char ch[])
{
str="text to"; // 产生一个字符串text to对象,跟good对象没关系,str暂时引用text to
ch[0]='g';// 因为数组没这个特性,所以第一个元素变成了'g'
}

//这里的str 是成员变量,所以又指向了good对象,因为good和text to是两个对象
System.out.print("ex.str"+"and");
//然后输出字符数组,因为数组对象始终是一个,所以被改变了
System.out.print(ex.xh);
答案补充
1.str 相当于C++里的指针,是一个引用,good是对象,str保存的是指向good对象的内存地址。

2.两个str是同一个引用,但指向不同的对象而已。

上一个:java.lang.OutOfMemoryError: Java heap space
下一个:帮我修改一下JAVA的聊天程序

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,