P27 :
这次用Java做期末大作业时,遇到了一个关于使用Java引用的错误:
关于Java函数参数的传递引用与C++传参引用的区别:
Java中,除了Primitive基本类型外,其他所有类型所传递的都是引用。
但是这里的“引用”与C++有区别,而且容易混淆。
看两个例子:
(一)
class Test{
static void func(String x){
x = "haha";
}
public static void main(String[] args){
String str = "aaa";
func(str);
System.out.println(str); // 输出什么?
}
}
(二)
class Node{
int x;
}
class Test{
static void func(Node n){
n.x = 4;
}
public static void main(String[] args){
Node a = new Node();
a.x = 10;
func(a);
System.out.println(a.x); // 输出什么?
}
}
答案:
(一) 输出: aaa
(二) 输出:4
为什么同样是引用传递,第一个的值没有改变,而第二个就改变了呢?
第一个程序输出了aaa,但是按照C++的经验,既然传参的是引用,那么这里应该是输出"haha"才对的,为什么还是输出"aaa" ?
原因在于,x是一个引用变量,通过调用func函数,传递str进去,这时func中的x和str指向了堆中的同一个对象。
然后是一个赋值语句 x = "haha", 这是关键,此时它并不是把x指向的对象变为"haha", 而是让x引用指向了另一个对象"aaa"!
而str这个引用还是指向原来那个"aaa"对象,所以当然还是输出"aaa"。在这里理解为指针或许更容易理解。
而第二个程序,并没有把函数中的引用指向另一个,而是操作了str指向的对象的数据,改变了它的值。所以输出了改变后的值。
由此看来,Java的引用不能简简单单的就认为它是C++中的引用或者指针。
分享到:
相关推荐
Java是一种面相对象的编程语言。计算机语言分成两种,第一种是面向机器结构的语言,构建数据模型是基于机器的结构。第二种是面向待解决问题结构的语言,构建数据模型是基于问题的结构。Java提供了更丰富的工具来描述...
java编程思想读书笔记,114页,压缩文件才39K。
Java编程思想重点笔记(Java开发必看)
Java编程思想读书笔记 doc doc
java编程思想笔记,建议与书本结合使用。。。。。。。。。。。
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
Java编程思想重点笔记(Java开发必看)满满的干货!!!!!
Java编程思想(第4版)读书笔记by CZFJava编程思想(第4版)读书笔记by CZFJava编程思想(第4版)读书笔记by CZF
Java并发编程学习笔记
该部分整理了 Java编程技术中所有的内容,同时附件中还给出了与c++的比较
《java编程思想》学习笔记
Java编程思想读书笔记.pdf
java编程思想读书笔记.rarjava编程思想读书笔记.rar
java编程思想的笔记。是别人的学习笔记。
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记
Java编程思想重点笔记(Java开发必看).pdf
Java基础 java学习笔记 Java Java基础Markdown学习笔记,可转换成PDF、Word等格式