`
h416756139
  • 浏览: 365707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java传值or传引用 二

    博客分类:
  • java
阅读更多

(接一)

5. 如何实现类似 swap 的方法

  传值还是传引用的问题,到此已经算是解决了,但是我们仍然不能解决这样一个问题:如果我有两个 int 型的变量 a  b,我想写一个方法来交换它们的值,应该怎么办?

  结论很让人失望——没有办法!因此,我们只能具体情况具体讨论,以经常使用交换方法的排序为例:

/**  6 */

/** *

 @(#) Test.java *

 @author fancy */

public class Test { 

  public static void swap(int[] data, int a, int b) {

       int t = data[a];

        data[a] = data[b];

        data[b] = t; 

  }   

public static void main(String[] args) {

       int[] data = new int[10];

       for (int i = 0; i < 10; i++) {

          data[i] = (int) (Math.random() * 100);            System.out.print(" " + data[i]);   

}     

  System.out.println(); 

      for (int i = 0; i < 9; i++) { 

          for (int j = i; j < 10; j++) { 

              if (data[i] > data[j]) {     

              swap(data, i, j);                }   

        }  

     }

       for (int i = 0; i < 10; i++) {

          System.out.print(" " + data[i]);

       }    

   System.out.println(); 

  }

}

  运行结果(情况之一)

78 69 94 38 95 31 50 97 84 1
1 31 38 50 69 78 84 94 95 97

  swap(int[] data, int a, int b) 方法在内部实际上是改变了 data 所指示的对象的成员数据,即上述讨论的第二种改变参数值的方法。希望大家能够举一反三,使用类似的方法来解决相关问题。

第二种说法

关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象)

首先以两个例子开始:

1
public class Test2 {

 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; 
   }
}
输出:AB,B

2
public class Test2 {

 public static void add3 (Integer i){ 
      int val=i.intValue();
      val += 3; 
      i = new Integer (val); 
  }

 public static void main (String args [ ] )  { 
 Integer  i = new Integer (0); 
  add3 (i); 
  System.out.println (i.intValue ( )); 
 } 

输出:0

首先我们应该明白JAVA中的参数传递全是以值传递的。

是基本类型,就拷贝一个基本类型传进方法;

是引用,就拷贝一个引用变量传进去方法,

理解了这两点就能理解方法操作对象的相关问题了。最好能画出引用指向对象的图出来,就能完全理解了。
题,调用operate方法时,传入了两个引用a,b的拷贝x,y,这两个x,y都指向原a,b引用所指向的对象。x.append(y)对它指向的对象 (a指向的对象)进行了操作。而x=y,只是两个拷贝变量在赋值,并没有影响到原b所指向的对象。所以b所指向的对象仍然为B
2题,i=new Integer(val)只是一个引用的拷贝指向了另外一个对象,而原来的i仍然是指向对象new Integer(0)的。
把握住了JAVA都是传值并且传的都是拷贝的话,类似的题大家都能迎刃而解了。 

Java中的参数传递只有一种方式: by value. 理论说教太麻烦了,直接看些例子吧:
1). 
基本类型
    public class A{
   public static void main(String[] args){
       int x = 1;
       System.out.println(x);    //1
       test(x);
       System.out.println(x);    //
还是1==>By value
   }
   
   static void test(int a){
      a = 2;
   }
}

2). 引用类型
    public class B{
   public static void main(String[] args){
       Integer x = new Integer(1);
       System.out.println(x);
       test(x);
       System.out.println(x);
       
   }
   
   static void test(Integer a){
      a = new Integer(2);
   }
}

  理解这里的关键是区分对象和引用。 这里声明的x是一个引用,而不是一个对象(只是Java把它设计为看上去好像是对象一样)。这个引用它指向了一个对象,这个对象就是后面用new关键字生成的对象。因此,可以说x指向了一个Integer对象。
  
在调用test方法的时候,程序将x作为参数传递给test方法了。这里仍然是值传递,在test调用过程中,会产生一份新的引用(不妨叫做y)。此时,xy指向了同一个对象。
   x
y指向的是同一个对象, 由于Java的设计,我们可以通过操作引用来达到操作对象的目的。因此,如果我们此时使用y来修改对象的属性 (例如,y.someField++); 你可以看到x指向的对象同时也被修改到了。
   
另一方面,如果我们让y指向另外一个对象, y=new Integer(2); 此时xy就指向了不同的
对象。y修改了它指向的对象的属性,很显然不会影响到x指向的对象。

 

有人说了数组。数组也是一个引用类型,它的参数传递方式按照引用类型的参数传递一样可以解释得通:

import java.util.Arrays;

public class A{
   public static void main(String[] args){
      int[] aa = {3, 2, 1};
      System.out.println(Arrays.toString(aa));  //[3, 2, 1]
      test(aa);
      System.out.println(Arrays.toString(aa));  //[3, 2, 1]
      test2(aa);
      System.out.println(Arrays.toString(aa));  //[4, 2, 1]
   }
   
   static void test(int[] a){
      a = new int[]{1, 2, 3};   //
指向了新对象
   }
   
   static void test2(int[] a){
     if(a != null && a.length > 0)
       a[0]++;              //
修改原来的那个对象
   }
}

 

 

对象是传引用,简单类型是传值,不要被网上的一些概念所迷惑!!!你可以自己做个试验。
至于String等类型传的还是引用。如果你用concat方法,String对象的原值就会被改变。
但你如果按如下方法:
public class Test {
    public static void test(String str) {
        str = "World";
    }
    public static void main(String[] args) {
        String string = "Hello";
        test(string);
        System.out.println(string);
    }
}

  运行结果:Hello
这里str = "World" 就等同于 String strnew String("World")。所以结果没有改变!!!

 下列程序在1处是否会有异常,如果没有,输出是什么?是否会运行到2处,如果会,输出是什么?为什么会有这样的结果?

 

  import java.util.arraylist;
   import java.util.list;
   
   public class testclass {


   public static void main(string args[]) {
     list list = new arraylist();
     test2(list);
     system.out.println(list.size()); // 1
     test3(list);
     system.out.println(list.size()); // 2
   }
   
   public static void test2(list list) {
     list = null;
   }
   
   public static void test3(list list) {
      list.add(“aaaa“);
   }
   }

plumechen:

不会出错的。结果是01

因 为test2(list)传得是list的引用,我理解成指针置的副本,list=null;只是把那个传入的值设置为null,不改变原来list的指 针和内容。test3(list)传入的一样,但是执行了list.add()由于传入指针值的副本也指向原来的那个list的地址,所以原来的那个 list的内容就改变了,size变成了1

总结:对于第一种说法,注意理解“引用是一种数据类型”,对于第二种说法,要理解“参数是引用的一个拷贝” 转自:http://blog.csdn.net/baobeiSimple/archive/2007/08/05/1727053.aspx

分享到:
评论

相关推荐

    java中传值与传引用

    在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...

    java中传值还是传引用的的认识

    "java中传值还是传引用的认识" Java 中的参数传递是值传递还是引用传递?这是一个经常引发讨论的问题。在 Java 中,参数传递是按值传递的,也就是说,传递给方法的参数是一个副本,而不是原始值本身。 当一个对象...

    Java是传值还是传址引用

    ### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...

    Java传值还是引用

    根据标题和描述,我们将深入探讨Java中传值与引用的区别,以及它们在实际编程中的应用。 首先,Java是一种“总是按值传递”的语言。这意味着无论是基本类型还是引用类型,当作为参数传递时,都会有一个副本被创建并...

    Java中的传值与传引用实现过程解析

    "Java中的传值与传引用实现过程解析" Java中的传值与传引用是Java编程语言中的一种基础概念,它们是Java函数中参数传递的两种方式。 Java中的传值是指函数参数的值被复制到函数内部,在函数内部对参数的修改不会...

    lotus domnio java代理传值

    "lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理之间传递参数。 首先,让我们了解一下Lotus Domino Java代理的基本概念。在Lotus Domino Designer中,Java代理是用Java语言...

    Java SE程序 界面传值问题

    Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE...

    Java传值和通过引用传递

    第一次使用int实验: public class TTEST { private static List&lt;UserEntity&gt; mList = new LinkedList(); public static void main(String[] args) { int a = 0; changeA(a); System.out.println("a = "+a);...

    传值传名传地址.zip

    总结起来,理解传值、传名(或传引用)和传地址的异同是编程基础的重要组成部分。它们影响着函数的可读性、效率以及程序的行为。在编写代码时,根据具体需求选择合适的参数传递方式,是提升代码质量的关键。

    Java中引用类型传值的代码清单.pdf

    当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1. `Circle.java` 文件定义了一个名为 `Circle` 的类,它包含一个 `double` ...

    jsp网页产生json传值到java的servlet,再回传到jsp页面

    在Web开发中,JavaServer Pages (JSP) 和 Java Servlets 是常见的技术组合,用于构建动态、交互式的网页。在本场景中,我们探讨的是如何使用JSP通过Ajax(Asynchronous JavaScript and XML)发送JSON(JavaScript ...

    Java中对象与引用

    ### Java中对象与引用 在Java编程中,深入理解对象与引用的概念对于掌握面向对象编程至关重要。本文将从以下几个方面详细解析对象与引用的基本概念及其相互间的关系。 #### 一、对象与引用的基础概念 **对象**: ...

    Java仙剑奇侠传源代码

    《Java仙剑奇侠传源代码》是一款基于Java J2ME平台开发的手机游戏,它再现了经典单机游戏《仙剑奇侠传》的世界观和游戏机制。J2ME,全称为Java Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备...

    浅谈Java中方法的参数传值.pdf

    Java方法参数传值是Java编程中的基础知识点,涉及变量、数据类型和方法调用的机制。在Java中,数据类型分为基本数据类型和引用数据类型。基本数据类型包括布尔型(boolean)、字节型(byte)、短整型(short)、整型...

    Java-Java面向对象中引用传递教程

    1. **传值与传引用的区别** - **传值**:基本数据类型(如int、char等)的参数传递是值传递,也就是说,方法内部对参数的修改不会影响到方法外部的变量。 - **传引用**:对于对象,Java总是采用引用传递。这意味着...

    基于or-tools的人员排班问题建模求解(JavaAPI)

    `OR-Tools`是谷歌推出的一个开源的、强大的优化工具箱,它支持多种编程语言,包括Java。本篇文章将深入探讨如何利用OR-Tools的Java API解决一个具体的实例——“人员排班问题”。 人员排班问题是一个典型的线性规划...

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    页面传值与后台传值

    在IT行业中,页面传值与后台传值是Web开发中的基础技能,特别是在使用Java进行后端处理时。这里我们将深入探讨这两个概念,并结合标签“jsp”和“json”,阐述它们在实际开发中的应用。 首先,页面传值指的是前端...

Global site tag (gtag.js) - Google Analytics