当前位置:  技术问答>java相关

急救…………

    来源: 互联网  发布时间:2015-05-15

    本文导语:  为什么结果是:AB,B  为什么不是:AB,AB ???  实在不懂!!!  public class Foo {          public static void main (String [] args) {                  StringBuffer a = new StringBuffer ("A");            ...

为什么结果是:AB,B 
为什么不是:AB,AB ??? 
实在不懂!!! 
public class Foo { 
        public static void main (String [] args) { 
                StringBuffer a = new StringBuffer ("A"); 
                StringBuffer b = new StringBuffer ("B"); 
                operate (a,b); 
                System.out.println(a + "," +b); 
        } 
        static void operate (StringBuffer x, StringBuffer y) { 
                x.append (y); 
                y = x; 
        } 


|
这个问题,和你前面那个问题同出一辙。

下面总结了在Java程序设计语言中可以利用方法参数做到河不能做到的几种情况:
1。方法不能下该基本类型的参数。
2。方法可以改变对象参数的状态。
3。方法不能使一个对象参数指向一个新的对象。

对应的例子为:
//1.
public static void tripleValue(double x){ 
    x = 3* x;
}
//2.
public static void tripeSalary(Employee x) {
    x.raiseSalary(200);
}
//3.
public static void swap(Employee x, Employee y) {
    Employee temp = x;
    x = y;
    y = temp;
}
你的程序属于第三种,即不能使一个对象参数指向一个新的对象。

如果你能找到《最新java2核心技术 卷I: 原理》的话看看page119

现在不是怎么能弄出最后的结果,而是先要理解实现机制。看看那本书,讲的很清楚。我确信你看了以后,对这方面不会存在问题,也就知道自己的程序该怎么设计和实现。

|
y的作用域,如果要得出你要的结果,代码如下:
public static void main (String [] args) {
                StringBuffer a = new StringBuffer ("A");
                StringBuffer b = new StringBuffer ("B");
                b=operate (a,b);
                System.out.println(a + "," +b);
        }
        static StringBuffer operate (StringBuffer x, StringBuffer y) {
                x.append (y);
                y = x;
                return y;
        }


  }

|
static void operate (StringBuffer x, StringBuffer y) { 
                x.append (y); 
                y = x; 
        } 
你这方法只是传入参数y,但y并没有因此改变,全局变量y被这个方法内的y隐藏了,也就是说,y值没有被处理

|
y原是指向b,后又指向了x(a),对y的操作不会影响到b

|
public void operate (StringBuffer x, StringBuffer y) {
                x.append (y);
                y = x;
                System.out.println("y:"+y);
                System.out.println("x:"+x);
        }
public static void main (String [] args) {
                StringBuffer a = new StringBuffer ("A");
                StringBuffer b = new StringBuffer ("B");
                b=operate (a,b);
                System.out.println(a + "," +b);
        }
在函数内部输出的
y:AB
x:AB
在主函数中输出的是AB,B 
这就是说结果传递的只有b,a并没有被传递。
这是变量的传值与传址的区别

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在线高分急救,急救,急救,急救,急救,急救!!!!!!!!!!
  • 急救,急救!(近来看看吧)
  • qmail奇怪的问题,急救啊 SOS!
  • linux 进入单用户或急救模式
  • 新手 用Linux搞的XP的D盘找不到了 急救
  • 各位兄弟,急救我是初学者,关于JBULID的问题?
  • 用jsp那个函数可以得到用户的IP地址,急救。谢谢!!!!!
  • 急救,请问如何得到jTree中被选中节点的父节点的path或者row?
  • 急救!怎样实现在线人数统计!!!
  • 各位高手,急救啊!!!!!
  • 急救!帮助
  • 急救,欢迎各位LINUX高手(火速)
  • 急救!!!简单的HELLOWORLD程序,编译痛不过
  • 急救!~!~!那位高手知道怎么安Realtek RTL8139网卡吗?
  • 急救!!——忘记了linux登陆密码,有办法进去吗?
  • 急救:关于BLOB数据类型---在线等待,高分相送!
  • 各位大虾,急教,急救!
  • 急救!删除了linux,进不了2k了。。
  • 急救
  • 急救!分数不是问题,就是要快!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3