`
艳沐石
  • 浏览: 37352 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

关于java中的参数传递

阅读更多
问题的引入是因为下午在群里看到了一个网友的问题:

给定如下Java 代码,编译运行后,输出结果是(  )。
public class Test {
    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;
    }
}
A. A,B    B. AB,B    C. A,AB     D.AB,AB

朋友可以猜猜这个答案,我也想告诉大家,答案是:B。也许有人会很惊讶,也许有人会很淡定。因为StringBuffer是一个类,对于类的使用,通过new,在堆中创建一个类的实例,利用一个引用来实现对这个对象的操作。当把一个引用当作参数传递到一个函数中的时候,C++采取的是:这个参数是一个地址。而在java中没有地址这个概念,一切都是值传递,那么这里又是怎么控制的。

首先,我做了一个测试:

public class Text {

    public static void main(String[] args) {

        String s = "b";

        f(s);

        System.out.println(s);

    }

    static void f(String s) {

        s = "c";

    }

} /* output

b

*///~

从结果可以看出:形参的效果并没有作用到实参中。我们继续看下一段代码:

public class Text {

    String s = "b";

    public static void main(String[] args) {

        Text t = new text();

        f(t.s);

        System.out.println(t.s);

    }

    static void f(String s) {

        s = "c";

    }

} /* output

b

*///~

这里的输出结果还是为b。继续:

public class Text {

    String s = "b";

    public static void main(String[] args) {

        Txet t = new Text();

        f(t);

        System.out.println(t.s);

    }

    static void f(Text t) {

        t.s = "c";

    }

} /* output

c

*///~

从结果中可以看出:形参的效果作用到了实参,这里的引用发生了效果。

String为系统带的类,而Text为自定义的类,为了防止是自定义类跟系统类的影响,又使用了另外一个系统类List进行验证:

public class Text {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<Integer>();
        list.add(33);
        l(list);
        System.out.println(list);

    }

    static void l(List<Integer> list) {
        list.add(55);
    }

} /* output

[33, 55]

*///~

从输出结果中可以看出:类的引用效果得以发挥。

针对上面的结果,我想朋友们会有一些意外,因为在java基础语言学习中,我们曾经对“==”与“equals()”的操作曾经进行了很多的讨论,结果说明:String类是一个引用类型,给出一段代码,以供大家学习:

public class SimpleTypeText {

public static void main(String[] args) {
      String s1 = "a";
      String s2 = "a";
      String s3 = new String("b");
      String s4 = new String("b");
      System.out.println("s1 == s2 ? " + (s1 == s2) );
      System.out.println("s1.equals(s2) ? " + s1.equals(s2));

      System.out.println("s2 == s3 ? " + (s2 == s3) );
      System.out.println("s2.equals(s3) ? " + s2.equals(s3));

      System.out.println("s3 == s4 ? " + (s3 == s4) );
      System.out.println("s3.equals(s4) ? " + s3.equals(s4));
 
      (s4, s1);
      }
      static void f(String s) {
          s = "a";
      }
      static void g(String s, String s1) {
          s = "a";
          System.out.println("通过常字符串:" + s == s1);
          s = new String(s1);
          System.out.println("通过new方法:" + s == s1);
      }
} /*output:

s1 == s2 ? true
s1.equals(s2) ? true
s2 == s3 ? false
s3.equals(s3) ? true
s3 == s4 ? false
s3.equals(s4) ? true
通过常字符串:true
通过new方法:false

*///~

总结:

1. thinking in java 中对String类型对象有这样一段描述:

String对象是不可变的,没一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象。

    对String类型的对象做参数有这样的一段描述:
每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。

2. 在字符串的声明中,利用常字符串初始化的时候,系统会从已有的常字符串进行查找,如果存在此字符串常量,则不再生成新的字符串常量,但是new方法不是这样的,即它不进行查找,直接开辟一段新的空间,存储这个字符串。

声明:以上代码均为参考,希望对基础有些帮助。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yanmushi/archive/2010/05/09/5573022.aspx
分享到:
评论

相关推荐

    11.java参数传递.zip

    11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...

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

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

    58.java参数传递机制.zip

    58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...

    java方法的参数传递其二.docx

    在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 在 Java 中,引用类型包括类、接口、数组等,都是对象的引用。这些引用类型在传递过程中,会将对象的引用传递给方法体内的变量,而不是对象的副本。因此...

    Java参数传递PPT

    Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...

    JAVA反射参数传递概略

    在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将变量的副本传递给方法,而引用传递则是传递变量指向的对象引用。对于基本类型,Java总是使用值传递;而对于对象,实际上是引用的复制,但仍然保持...

    Jni中C++和Java的参数传递

    在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java对象和C++数据类型的映射关系。在JNI中,Java的基本数据类型如`boolean`, `byte`, `char`, `short`, `int`, `float`, `...

    Java参数传递的经典示例

    Java参数传递机制是编程中非常重要的概念,它涉及到基本类型和引用类型的差异。在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递...

    java传递参数的方法

    java传递参数的方法 很的东西 大家下载学习一下

    java参数传递

    这里详细的说明了,java参数传递的过程,引用传递,值传递

    Jni中C和Java的参数传递.doc

    总结一下,JNI 参数传递的关键点包括: 1. **类型映射**:Java 和 C++ 的数据类型不同,需要使用 JNI 提供的类型映射,如 `jint`、`jstring` 等。 2. **字段访问**:使用 JNI 的 `GetFieldID` 和 `GetObjectField`...

    JAVA语言中参数传递的深入剖析.pdf

    Java语言中参数传递的深入剖析 Java语言中参数传递的机制是一个复杂的主题,对于初学者来说,参数传递机制是一个难点。许多教材、论文和帮助手册对Java语言中参数传递的机制进行了探讨,但这些说法不一,有些模糊带...

    java中参数传递的演示

    java中参数传递的演示,分析传值与传引用的区别

    java参数的传递与返回值

    #### 一、Java参数传递的基本概念 在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用传递(Pass-by-reference)。...

    62.java引用类型的参数传递.zip

    62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....

    59.java基本类型的参数传递.zip

    59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....

    java中参数传递方式详解

    Java中参数传递方式详解 Java 中参数传递方式详解是 Java 新手入门面临的一个经典的话题。本文意在终结这个话题,Java 中有说法:Java 里面参数传递都是按值传递,怎么理解这句话? 按值传递和按引用传递是来自 ...

    java 参数传递

    Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论...Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。

    java中传递数组参数

    1. **直接传递数组:** 在Java中,当我们想要将一个数组作为参数传递给某个方法时,只需要在方法的参数列表中指定数组类型即可。 ```java public void someMethod(int[] array) { // 方法体 } ``` 上述代码...

    Java的引用和函数参数传递

    通过上述分析,我们可以清楚地了解到Java中引用和函数参数传递的基本概念以及它们的具体应用。了解这些概念对于正确使用Java进行编程非常重要,尤其是在处理复杂的数据结构和对象交互时。希望本文能帮助读者更好地...

Global site tag (gtag.js) - Google Analytics