精华内容
下载资源
问答
  • java传递String类型参数

    万次阅读 2015-03-07 21:51:17
    因为在java里,String是对象类型,作为参数肯定是引用传递。之所以有值传递的效果,是因为Stirng内部实现时,是用char[] 来存储字符串的,所以String相当于char[]的包装类,那java中,包装类的一个特质就是值操作时...

    转载请注明出处

    http://blog.csdn.net/pony_maggie/article/details/44120045

    作者:小马


    看一段代码:


    public class ArrayTest 
    {
    	//都是引用传递,输出的结果是"goodbbb"
    	public void arrayPassTest(String s, String[] ss)
    	{
    		s = "bad";
    		ss[0] = "bbb";
    	}

    public static void main(String[] args) 
    	{
    		String s1 = new String("good");
    		String[] ss1 = {"aaa"}; //string数组,只有一个元素
    		
    		ArrayTest test = new ArrayTest();
    		test.arrayPassTest(s1, ss1);
    		System.out.println(s1+ss1[0]);

    输出结果:

    goodbbb


    如果你认为arrayPassTest 函数中,s是作为值传递,而ss是作为引用传递,所以有这样的输出结果,也不算错误,但是决对没有真正理解里面的原因。在这里,String 类型的传递是引用传递,也即是地址传递。这个是毋庸置疑的。因为在java里,String是对象类型,作为参数肯定是引用传递。之所以有值传递的效果,是因为Stirng内部实现时,是用char[] 来存储字符串的,所以String相当于char[]的包装类,那java中,包装类的一个特质就是值操作时体现对应的基本类型的特质。


    这个确实有点难理解,尤其是从C/C++转出过的程序员。需要再慢慢揣摩。


    ss参数完全符合引用传递的特点,很好理解,不多说。附上String的构造函数实现,

    public String(String original) {
    	int size = original.count;
    	char[] originalValue = original.value;
    	char[] v;
      	if (originalValue.length > size) {
     	    // The array representing the String is bigger than the new
     	    // String itself.  Perhaps this constructor is being called
     	    // in order to trim the baggage, so make a copy of the array.
    	    v = new char[size];
     	    System.arraycopy(originalValue, original.offset, v, 0, size);
     	} else {
     	    // The array representing the String is the same
     	    // size as the String, so no point in making a copy.
    	    v = originalValue;
     	}
    	this.offset = 0;
    	this.count = size;
    	this.value = v;
        }

    这个示例也给我们一个启示,当写一个函数传递数组时,不要直接对内部成员赋值,否则结果就不可控了, 比如下面这个函数,如果myArray被某个成员函数改变了,那么传递的这个数组也会改变。

    public void setArray(String[] newArray)
    	{
    		this.m_myArray = newArray;
    	} 

    而应该这样实现比较好,

    public void setArrayNew(String[] newArray)
    	{
    		if(newArray == null)
    		{
    			this.m_myArray = new String[0];
    		}
    		else
    		{
    			this.m_myArray = new String[newArray.length];
    			System.arraycopy(newArray, 0, this.m_myArray, 0, newArray.length);
    		}
    	}



    展开全文
  • 主要介绍了简单谈谈JavaString类型参数传递问题的相关资料,需要的朋友可以参考下
  • java函数的参数传递String类型

    千次阅读 2010-03-08 14:37:00
    以下内容摘自java函数的参数传递String类型 http://www.blogjava.net/thuixy/archive/2009/06/06/280302.html 说完了javaString类型,我们最后看看java函数参数的传递,到底是值传递还是引用传递呢?...

    以下内容摘自java函数的参数传递和String类型 http://www.blogjava.net/thuixy/archive/2009/06/06/280302.html

     

    说完了java的String类型,我们最后看看java函数参数的传递,到底是值传递还是引用传递呢?一般的说法是对于基本类型比如int、char是值传递,对于对象类型是引用传递。这种说法没错,但是请看下面的例子:

    String s=”abc”;

    change(s);

    System.out.println(s);

    public void change(String str)

    {

         str=”abcd”;

    }

    上面的程序会有什么结果呢?打印abc还是abcd,运行程序会发现打印的是abc,完了,似乎不合乎常理,按理说String 也是对象,应该是引用传递才对啊,有的同学知道java的String类型是不可变类型,会得出结果abc,具体解释是String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和String在这种情况下的表现是相同的。下面从函数参数传递的方式来理解也可以得出相同的结果。

    java的参数传递本质上都可以认为是值传递,对基本类型自然不必说,对于对象类型,传递的是对象的地址,地址是个数字,也是基本类型,所以也还是值传递的, 有了这个基础,上面的题目可以这样理解,s是字符串abc的地址,调用change方法时,把s的拷贝赋给str,即str也指向abc,但是在方法里又把str指向abcd,str就是abcd的地址了,但是s还是指向的abc。

    展开全文
  • java中的参数传递(只有值传递没有引用传递)

    万次阅读 多人点赞 2019-07-31 19:25:14
    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。 java中的数据类型 Java中...

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。

    java中的数据类型

    Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。

    基本类型的变量保存原始值,即它代表的值就是数值本身;

    而引用类型的变量保存的值是引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

    基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress。

    引用类型包括:类、接口类型和数组。

    java中只有值传递

    在日常编码中,会经常看到如下现象:

    1、对于基本类型参数,在方法体内对参数进行重新赋值,不会改变原有变量的值。

    2、对于引用类型参数,在方法体内对参数进行重新赋予引用,不会改变原有变量所持有的引用。

    3、方法体内对参数进行运算,不会改变原有变量的值。

    4、对于引用类型参数,方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值。

    举个例子:

    public class Main {
    
        private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr){
    
            b = true;
    
            boo = new Boolean(true);
    
            arr[0] = true;
    
        }
    
           //测试
    
        public static void main(String[] args) {
    
            boolean b = false;
    
            Boolean boo = new Boolean(false);
    
            Boolean[] arr = new Boolean[]{false};
    
            getMiddleOne(b, boo, arr);
    
            System.out.println(b);
    
            System.out.println(boo.toString());
    
            System.out.println(arr[0]);
    
            /**
    
            * output:
    
            * false
    
            * false
    
            * true
    
            */
    
        }
    
    }

    我们只要了解了下面两点就可以解答上面的现象了:

    1、基本数据类型的值就是数值本身,所以示例中的b的值就是false;包装类因为会自动装箱拆箱,所以可以和基本类型一样处理,所以示例中boo的值就是false;数组是引用类型,所以arr的值就是指向该Boolean[]的引用。

    2、java中只有值传递没有引用传递,所以传入getMiddleOne方法的三个参数分别是b的值拷贝, boo的值拷贝, arr的值拷贝。

    通过上面两点就可以清楚了,getMiddleOne方法中执行的 b=true 和 boo = new Boolean(true) 都是把新值赋给了他们的拷贝,所以不改变原变量的值;同样,arr[0] = true 是把true复制给了arr的拷贝所指向的数组的第一个元素,arr的值和arr的拷贝的值都是该数组的引用,所以arr的拷贝所指向的数组和arr所指向的数组是同一个,所以改变arr的拷贝的数组的元素会同样影响到原变量arr。

    总结

    java中只有值传递,基本类型传递的是值的副本,引用类型传递的是引用的副本。

     

    展开全文
  • postgresql对传入的参数类型匹配相当严格 如select * from user where id = #id# 假设id类型为numeric,而传入的id为string的话postgresql就会报错: --- Cause: org.postgresql.util....

    postgresql对传入的参数类型匹配相当严格

    如select * from user where id = #id#

    假设id类型为numeric,而传入的id为string的话postgresql就会报错:

    --- Cause: org.postgresql.util.PSQLException: ERROR: operator does not exist: numeric = character varying

      建议:No operator matches the given name and argument type(s). You might need to add explicit type
     casts.
      位置:125
    Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: numeric = character varying
      建议:No operator matches the given name and argument type(s). You might need to add explicit type
     casts.

    暂时想到的解决方法:

    select * from user where id = cast(#id# as numeric)

    如果哪位大神有更好的方法请告知!

    展开全文
  • 原理知识: 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值. 如果参数类型是引用类型,那么传...
  • javaString类型作为参数传递

    千次阅读 2016-11-29 15:01:45
    转载:http://blog.csdn.net/pony_maggie/article/details/44120045 看一段代码: [java] view plain copy   ... //都是引用传递,输出的结果是"goodbbb"   publi
  • 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值. 如果参数类型是引用类型,那么传过来的就是...
  • 我知道java里面参数传递是值传递,这点不用给我解释了。但是: import java.util.*; public class Test { public static void change(String s){ s="2"; } public static void main(String[] args) throws ...
  • 这个问题,可能是太简单了。稍微有点经验的,估计都不会犯这个错误。不好意思,过了个年,几条不写代码,生疏了,也就有了下面的bug。 先看代码,你要是一眼就看出问题了,那就请允许在下水... String transmitValue =
  • 首先,java中有这两种类型数据。基本数据类型 整型:byte,short,int,long浮点型:float,double字符型:char布尔型:boolean引用数据类型 数组对象(类、接口)一般情况下,基本数据类型传递时是值传递,引用数据...
  • javaString对象作为参数传递问题

    千次阅读 2020-06-03 15:24:04
    java中将对象作为参数传递究竟是值传递还是引用传递? 1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。 2、对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了...
  • 一种解释就是,对String类型的变量赋值时并没有new出对象,而是直接用字符串赋值,所以Java就把这个String类型的变量当作基本类型看待了。即,应该String str = new String(“original”);,而不是String str ...
  • java参数传递(值类型,引用类型

    千次阅读 2019-03-05 18:04:39
    amp;qid=25203 以下代码执行后,结果是:AB,B。 public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer("A"); S...
  • 代码示例: public class TimerTest_main { String obj="Object"; public static void main(String[] agrs){ TimerTest_main obj_demo = new TimerTest_main();... String str =new String( "strin
  • Java参数传递

    千次阅读 2009-06-16 14:26:00
    Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)”,争论的双方各执一词,互不相让。不但“菜鸟”们一头雾水,一些“老鸟”也只知道结果却说不出所以然来。我相信看过下面的内容后...
  • 方法的参数传递 1、值传递  a) 方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。传到方法里的参数类型是基本数据类型的都叫值传递 2、引用传递 a) 也称为...
  • java参数传递的方式

    千次阅读 2017-07-23 16:10:11
    对于程序设计语言来说,一般函数的参数传递有两种:按值传递和按引用传递。 按值传递表示函数接收的是调用者提供的值,按引用传递表示函数接收的是调用者提供的变量地址。需要注意的是,函数可以修改按引用传递的...
  • 经典名言:O’Reilly’s Java in a Nutshell by David Flanagan (see Resources) puts it best: “Java manipulates objects ‘by reference,’ but it passes object references to methods ‘by val
  • 只不过传递引用数据类型时,传递的是对象的地址,如Person p = new Person()时,把p作为参数传递时,传递的是p中保存的new的Person的地址(网上很多人把这叫做引用传递),那么在方法中对p的属性进行
  • 有人说java 参数传递在对primitive类型参数传递时候是值传递,对对象参数的传递是引用传递。 可是JAVA规范里面却说的是总是值传递。 看看这个图就理解了。 对传入的参数总是有个copy的过程。因为primitive类型...
  • 通常参数传递有两种:  基本类型:不会影响实际参数的值  引用类型:会影响实际参数的值 而String和StringBuffer作为引用类型是否是上面的一样的呢?首先看一下下面的例子 package xfcy_01; /** * 案例: String...
  • java参数传递机制浅析

    千次阅读 2014-04-28 09:46:47
    欢迎转载,转载请声明出处! ----------------------------...下面将通过几个例子来说明java中的参数传递机制,这些例子基本涵盖了所有参数传递的情况。 1.基本数据类型: public static void testBase(int i)
  • android-jni与java参数传递

    千次阅读 2012-05-09 19:05:57
    android-jni与java参数传递 =================================================================================================== 问题的来源: jni与java层之间互传参数,有几个问题需要解决: 1、需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 472,595
精华内容 189,038
关键字:

java参数传递string类型

java 订阅