导航:首页 > 编程语言 > javastring传递

javastring传递

发布时间:2022-09-20 15:21:29

1. 在java中String的传参

这个是储存结构的问题
1,str1是个地址值,传给str的也是这个地址值,此时,str=str1=地址值,都指向常量池中的“good”
2,当执行 str="test ok"后,常量池中出现“test ok”,str改变且指向常量池中的“test ok”,此时str1仍指向常量池中的“good”,str地址值不等于str1地址值
3,你的程序并不能说明你的问题,输出结果应该是 test ok and gbc
4,简单来记:基本数据类型和String str在传参方法中改变是无效的,但String[] str、char[] ch之类是有效的

2. java string是值传递还是引用传递

你是C/C++或是VB转过来的吗看在Java中过多考虑引用(指针)和值之间的关系是步入歧途,这正是Java的设计者极力避免你考虑的问题。你需要明白的是:1、Java中所有方法的参数的传递都是逗值传递地;2、Java中所有对象类型的变量的逗值地,本质上说,包含了Java堆中的实际对象的地址,你可以大体认为Java的变量对应了C/C++中的指针(其实这里面有更复杂的机制)。事实上,Java并不像C/C++一样明确的区分逗值语义地与逗引用语义地,Java栈中也不会存放任何对象的实体(这点与C/C++不同,C/C++栈中可以存放对象实体),所有的Java对象都是在堆中。概念上的区别在于,我这里提到的逗变量地是指Java栈中的内容,对应你说的逗引用地;我提到的逗对象地是指Java堆中的实体,对应你说的逗值地。而一般Java教材中提到的逗值传递地,是指这些逗变量地的内容的传递,不是Java堆中的对象实体的传递。你用字符串来做实验,并推广为所有Java对象的做法,并不是特别合适。Java的String类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:a="s";b="s";a和b并不像其它对象一样有创建的动作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的语句:a=newString("s");b=newString("s");是分别在Java堆中创建了2个对象,此时a!=b。本质上说,对于基本数据类型(整数、字符等),Java的符号==,用于判断二者的值是否相等;对于对象类型,Java的符号==,用于判断两个变量是否是逗同一个对象地,equals()方法才是用于判断两个对象是否相等。你希望实现的swap逻辑,在Java中通常认为是无法实现的。拿你这个例子来说,swapValue()中的tmpValue无论怎么更改,只是改变tmpValue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象)。这也是为什么Java最初说自己永远是值传递。你只有改变tmpValue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变。为了弥补这个缺陷,C#才加入了ref关键字,允许传入变量的引用(如果参考C/C++,C#传递的实际是二级指针,它的内容是栈中的变量的地址)。

3. java string是引用传递还是值传递

String是引用类型,不过java有字符串常量池机制,声明字符串常量或者字符串常量内连接容都要用到字符串常量池。如果常量池中有该字符串序列则返回,所以str创建了一个字符串并放入常量池中,str2内的字符序列已在常量池中所以str2直接指向str指向的对象。
而new String()一定会在堆上新创建对象,所以肯定false
例子:
String str="scce"; //创建了一个对象
String str2="scce"; //指向一个对象,不是新建
str==str2返回true //同一个内存地址
String str2=new String("scce"); str==str2返回false //新建了一个对象,内存地址不一样!

4. java string怎么传引用传递

你是C/C++或是VB转过来的吗?在Java中过多考虑引用(指针)和值之间的关系是步入歧途,这正是Java的设计者极力避免你考虑的问题。
你需要明白的是:
1、Java中所有方法的参数的传递都是“值传递”;
2、Java中所有对象类型的变量的“值”,本质上说,包含了Java堆中的实际对象的地址,你可以大体认为Java的变量对应了C/C++中的指针(其实这里面有更复杂的机制)。事实上,Java并不像C/C++一样明确的区分“值语义”与“引用语义”,Java栈中也不会存放任何对象的实体(这点与C/C++不同,C/C++栈中可以存放对象实体),所有的Java对象都是在堆中。

概念上的区别在于,我这里提到的“变量”是指Java栈中的内容,对应你说的“引用”;我提到的“对象”是指Java堆中的实体,对应你说的“值”。而一般Java教材中提到的“值传递”,是指这些“变量”的内容的传递,不是Java堆中的对象实体的传递。

你用字符串来做实验,并推广为所有Java对象的做法,并不是特别合适。Java的String类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:
a = "s";
b = "s";
a和b并不像其它对象一样有创建的动作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的语句:
a = new String("s");
b = new String("s");
是分别在Java堆中创建了2个对象,此时a!=b。

本质上说,对于基本数据类型(整数、字符等),Java的符号==,用于判断二者的值是否相等;对于对象类型,Java的符号==,用于判断两个变量是否是“同一个对象”,equals()方法才是用于判断两个对象是否相等。

你希望实现的swap逻辑,在Java中通常认为是无法实现的。拿你这个例子来说,swapValue()中的tmpValue无论怎么更改,只是改变tmpValue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象)。这也是为什么Java最初说自己永远是值传递。你只有改变tmpValue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变。

为了弥补这个缺陷,C#才加入了ref关键字,允许传入变量的引用(如果参考C/C++,C#传递的实际是二级指针,它的内容是栈中的变量的地址)。

5. java string是值传递还是引用传递

你是C/C++或是VB转过来的吗?在Java中过多考虑引用(指针)和值之间的关系是步入歧途,这正是Java的设计者极力避免你考虑的问题。
你需要明白的是:
1、Java中所有方法的参数的传递都是“值传递”;
2、Java中所有对象类型的变量的“值”,本质上说,包含了Java堆中的实际对象的地址,你可以大体认为Java的变量对应了C/C++中的指针(其实这里面有更复杂的机制)。事实上,Java并不像C/C++一样明确的区分“值语义”与“引用语义”,Java栈中也不会存放任何对象的实体(这点与C/C++不同,C/C++栈中可以存放对象实体),所有的Java对象都是在堆中。

概念上的区别在于,我这里提到的“变量”是指Java栈中的内容,对应你说的“引用”;我提到的“对象”是指Java堆中的实体,对应你说的“值”。而一般Java教材中提到的“值传递”,是指这些“变量”的内容的传递,不是Java堆中的对象实体的传递。

你用字符串来做实验,并推广为所有Java对象的做法,并不是特别合适。Java的String类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:
a = "s";
b = "s";
a和b并不像其它对象一样有创建的动作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的语句:
a = new String("s");
b = new String("s");
是分别在Java堆中创建了2个对象,此时a!=b。

本质上说,对于基本数据类型(整数、字符等),Java的符号==,用于判断二者的值是否相等;对于对象类型,Java的符号==,用于判断两个变量是否是“同一个对象”,equals()方法才是用于判断两个对象是否相等。

你希望实现的swap逻辑,在Java中通常认为是无法实现的。拿你这个例子来说,swapValue()中的tmpValue无论怎么更改,只是改变tmpValue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象)。这也是为什么Java最初说自己永远是值传递。你只有改变tmpValue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变。

为了弥补这个缺陷,C#才加入了ref关键字,允许传入变量的引用(如果参考C/C++,C#传递的实际是二级指针,它的内容是栈中的变量的地址)。

6. java string 类型 作为参数是什么传递

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

7. java string 类型 作为参数是什么传递

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

8. Java String引用传递问题

了解数据在堆栈内存中的存储,这道问题就可以解了。
1.String对象传入方法后,str2是局部变量,方法结束之后,局部变量值会在缓冲区中。但是并没有修改成员变量str1的值,而输出的仍然是str1的值,"hello"。(局部变量和成员变量是不同的变量,即使名字相同)
2.至于第二个因为类的实例化,对象可以指向该类地址,可以访问该类的成员变量。对象指向成员变量temp,调用方法tell方法时,传入的是Ref2对象的地址。该地址可以找到Ref2的成员变量temp。然后把"xueyuan"赋给temp,由此temp的值已经改变,方法调用结束之后,输出的是Ref2类的已经改变值的成员变量

9. java怎么实现String的引用传递

1、定义全局变量 ,两种方法,可以在方法内任意对其重新赋值,方法内变量名要与全局变量相同,也可以使用return新字符串,调用时重新赋值
2、定义局部变量 ,一种方法,只能通过调用方法return新字符串,对原字符串重新赋值

10. Java String值传递

楼上混淆了 值传递和引用传递
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

解决楼上的问题就是将值传递改成引用传递 look

public class Test {
/**
* 功能描述: <br>
*
* @param args
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static void main(String[] args) {
String a[] = new String [1];
a[0] ="b";
Test t = new Test();
t.test(a);
System.out.println(a[0]);
}
public void test(String ...a)
{
a[0] = "sss";
}
}

阅读全文

与javastring传递相关的资料

热点内容
传感器视频教程下载 浏览:95
flash源文件贺卡下载 浏览:434
如何提高网络扶贫的效果 浏览:654
飞车软件文件夹叫什么 浏览:242
刷ec用什么编程器 浏览:765
方菱数控u盘文件格式 浏览:260
编程为什么输出两个变量 浏览:490
卫星大锅2017用升级吗 浏览:113
玉米win10系统下载 浏览:134
fgo技能升级减cd吗 浏览:129
什么记账app免费好用 浏览:441
网络检测可以检测到什么 浏览:504
sip协议教程 浏览:832
编程哪里可以接项目 浏览:119
孤岛惊魂win10 浏览:246
网络HRV是什么意思 浏览:918
word框中打勾 浏览:577
tcl笔试题java 浏览:467
win10怎么登录安全模式 浏览:679
除了archdaily还有什么网站 浏览:567

友情链接