选择显示字体大小

谈谈java中的调用方式

   很多书籍都说java支持传引用调用的方式,类似于c++中的person &a引用调用,而近来编程遇到一系列问题让我对此产生了怀疑,于是将这些方法一一列出,我们来一起看看java中的调用方式:

  看下面的程序:

class person {

     private string name;//姓名

    private string sex;//性别

    public person(string x, string y) {
        this.name = x;
        this.sex = y;
    }

    public void setstatus(string x, string y) {
        this.name = x;
        this.sex = y;

    }

    public string tostring() {

        return name + sex;

    }

    //  -----交换普通对象-----
    public static void changeref(person tmpx, person tmpy) {
        //交换tmpx和tmpy对象
        person swapref = tmpx;
        tmpx = tmpy;
        tmpy = swapref;
//        system.out.println("在方法中交换的结果: refa =" + tmpx.tostring());
//        system.out.println("在方法中交换的结果: refb =" + tmpy.tostring());
    }

    // ----- 交换数组对象-----
    public static void changearrayref(person[] x, person[] y) {

        //交换数组对象
        person swaparrayref = x[x.length-1];
        x[x.length-1] =y[x.length-1];
        y[x.length-1] = swaparrayref;

    }
    

    //-----交换数组-----
    public static void changearray(int[] x,int[] y) {

       int[] tmp =x;      
       x = y;
       y = tmp;
      
      
    }
    

}



public class demo {

    public static void main(string[] args) {
        
        //-------建立并构造两个对象---------
        person refa = new person("张三", "男");
        person refb = new person("李四", "男");

        //交换refa对象和refb对象
        person.changeref(refa, refb);
        //从交换结果中看出,实际对象并未交换
        system.out.println("在主函数中交换的结果 refa = " + refa.tostring());
        system.out.println("在主函数中交换的结果 refb = " + refb.tostring());
                
        //-------建立两个对象数组----------
        person[] arraya = new person[1];
        person[] arrayb = new person[1];
        
        //分别构造数组对象
        arraya[0] = new person("王五","男");
        arrayb[0] = new person("赵六","男");
        
        /*数组对象为null时,不能设置其值,必须先构造它(即调用构造函数),再用其它方法设置其值
      */
    
        system.out.println('\n'+"数组对象交换前的结果 arraya = " + arraya[0].tostring());
        system.out.println("数组对象交换前的结果 arrayb = " + arrayb[0].tostring());
        //交换这两个数组对象
        person.changearrayref(arraya, arrayb);
        system.out.println("-交换后的结果 arraya = " + arraya[0].tostring());
        system.out.println("-交换后的结果 arrayb = " + arrayb[0].tostring());

        //-------建立两个普通数组---------
        int[] a = new int[2];
        int[] b = new int[2];
  
        //给数组个元素赋值
        for(int i =0;i<a.length;i++){
            a[i] = i;
            b[i] = i+1;
        }    
        
        system.out.println('\n'+&quot;数组交换前 inta[0] = &quot; + a[0]);
        system.out.println(&quot;数组交换前 intb[0] = &quot; + b[0]);
        
        //交换数组
        person.changearray(a,b);        
  
        system.out.println(&quot;-交换后的结果 inta[0] = &quot; + a[0]);
        system.out.println(&quot;-交换后的结果 intb[0] = &quot; + b[0]);
  
        
    }
}


  从程序执行的结果来看:在交换两个对象时,仅仅改变了对象句柄的指向,而没有改变对象内容,因此方法参数为对象时,并不交换实际内容,而是交换了拷贝内容。
  
  数组对象有点奇怪,在形参中交换了,实参也反应出来。

  数组和普通数据类型一样,形参的改变,不会反应到实参中来。

  对象也一样,形参改变了,实参一样不会反应出来。

  小结一下:
  1、方法可以修改对象参数的状态
  2、方法不能让对象参数指向新的对象
  3、方法不能修改基本类型(int、byte等)的参数
  
  因此要想交换对象,在方法体中是不现实的,用clone才能完成&hellip;&hellip;未完,待续&hellip;&hellip;&hellip;&hellip;
  


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons