new 就是说在内存空间中新开辟一块地方。Object 01 =02 ;是把01指向了 02所表示的那块内存的空间 你用 o1.equals(o2) 返回是一个TRUE ==只是比较值是否相等,而equals比较内存地址跟值。
JAVA的数据类型 有基本的数据类型跟引用数据类型 基本的值传递, 引用的内存地址传递
首先要搞清楚基础类型 java的八种基础类型,基础类型都是直接传值的。非基础类型即拥有 Class 对象的 实例,他们是需要堆空间的,指向他们的就是引用,引用所使用的存储空间是和基础类型一样,分配在栈中,所以引用改变就是直接改变了引用的内容。改变引用的内容是改变引用所指向的东西,而不会改变之前被引用的 实例 内容。引用可以通过 实例函数去改变实例内容,这个是由于实例函数是知道实例的地址,直接操作实例地址中的内容的。所以你说 java到底是传值还是转引用了? 任何语言数据操作都是在赋值,在传值。传址只是人为的使用技巧在赋值的基础上建立的一种概念,概念怎么去说我觉得不太重要,重要的是你清楚它是什么做的。
个人观点关于“基本类型是按值传递,非基本类型是按引用传递”这点 Object a = ... Object b = ... swap(a, b) 如果你能通过swap改变a、b引用的对象就证明是按引用传递,事实证明是按值传递 不过退一步讲,我们的程序里真正需要操作的并不是a、b引用本身,而是它们引用的对象,所以java通过“引用”这种数据类型,使得在按值传递的基础上间接实现了实际引用对象的引用的传递所以,对于这个问题的答案 如果一定要精确地深究的话,答案是都是按值传递 但是如果我们着眼于堆上的对象本身的话,需要清楚在函数内部对参数里的引用进行操作的时候,实际操作的是函数外部的对象,这才是之所以要区分按值传递和按引用传递的最终目的,所以,结论是,java里通过按值传递实现了C++里按引用传递所能达到的效果
java里面只有值传递,传递的参数是原来参数的一个克隆
首先回顾一下在程序设计语言中有关参数的传递方法(或者函数)的一些专业术语,值调用表示方法接受的是调用者提供的值,而引用调用表示方法接收的是调用者提供的变量地址,一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 java程序设计语言总是采用值传递也就是说方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。 例如 double p = 10; harry。raiseSalary(p); 不必理睬这个方法的具体实现,在方法调用之后,p的值还是10 如果还是不能理解可以找《java核心技术》第八版第115页开始都是讲解java的调用
都是值传递 public class TestPassByValue { private String value; public TestPassByValue(String value) { this.value=value; } public void print(){ System.out.println(value); } public static void main (String args[]) { TestPassByValue a=new TestPassByValue("first"); TestPassByValue b=a; a.print(); b.print(); a=new TestPassByValue("second"); a.print(); b.print(); } }运行结果: first first second first 明显是值传递如果是按址传递、运行结果应该是: first first second second按值时: b=a他们的正直地址不同、但他们引用“相同的地址”-- new TestPassByValue("first") a=new TestPassByValue("second")、改变了a的引用-新建立的对象,b的引用值不受影响按址时: b=a、b指向a的地址、a指向new TestPassByValue("first")的地址 a=new TestPassByValue("second")、a指向new TestPassByValue("second")的地址、b还是指向a的地址
java到底是按值传递还是按引用传递?
任何语言数据操作都是在赋值,在传值。传址只是人为的使用技巧在赋值的基础上建立的一种概念,概念怎么去说我觉得不太重要,重要的是你清楚它是什么做的。
Object a = ...
Object b = ...
swap(a, b)
如果你能通过swap改变a、b引用的对象就证明是按引用传递,事实证明是按值传递
不过退一步讲,我们的程序里真正需要操作的并不是a、b引用本身,而是它们引用的对象,所以java通过“引用”这种数据类型,使得在按值传递的基础上间接实现了实际引用对象的引用的传递所以,对于这个问题的答案
如果一定要精确地深究的话,答案是都是按值传递
但是如果我们着眼于堆上的对象本身的话,需要清楚在函数内部对参数里的引用进行操作的时候,实际操作的是函数外部的对象,这才是之所以要区分按值传递和按引用传递的最终目的,所以,结论是,java里通过按值传递实现了C++里按引用传递所能达到的效果
java程序设计语言总是采用值传递也就是说方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。
例如 double p = 10;
harry。raiseSalary(p);
不必理睬这个方法的具体实现,在方法调用之后,p的值还是10
如果还是不能理解可以找《java核心技术》第八版第115页开始都是讲解java的调用
public class TestPassByValue {
private String value;
public TestPassByValue(String value) {
this.value=value;
}
public void print(){
System.out.println(value);
}
public static void main (String args[]) {
TestPassByValue a=new TestPassByValue("first");
TestPassByValue b=a;
a.print();
b.print();
a=new TestPassByValue("second");
a.print();
b.print();
}
}运行结果:
first
first
second
first
明显是值传递如果是按址传递、运行结果应该是:
first
first
second
second按值时:
b=a他们的正直地址不同、但他们引用“相同的地址”-- new TestPassByValue("first")
a=new TestPassByValue("second")、改变了a的引用-新建立的对象,b的引用值不受影响按址时:
b=a、b指向a的地址、a指向new TestPassByValue("first")的地址
a=new TestPassByValue("second")、a指向new TestPassByValue("second")的地址、b还是指向a的地址
http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
这个网站上说的还可以·
比如 String s = "abc";
要知道 s 是个栈内的变量,有自己的内存空间,它的内存空间保存着 "abc"字符串对象的地址
如果 值 理解为变量的内存空间保存的内容,那么都是按 值 传递的
如果 值 理解为"abc"字符串对象的内容,那么就是按 引用 传递的
b=a;这句不是b指向a的地址,而是说a,b指向同一个地址。当a=new TestPassByValue("second")时,a指向的地址发生变化,跟b没有一点关系,个人见解
非常同意,java中只有值传递,没有引用传递,如果你学过C++你就会知道,C++中的引用传递才是真正意义上的引用传递。java中所谓的引用传递只是便于理解非基本数据类型传递的方式是传递地址值。
先来回顾一下程序设计语言中有关参数传递的计算机科学术语。“传值调用”(call by value)表示方法得到的是调用者提供的值。与之相对,“传引用调用”(call by reference)表示方法得到的是调用者提供的变量地址。这样,方法可以修改引用调用所传递变量的值,但不能修改传值调用送来的变量。不论是在Java中还是在其他各种程序设计语言中,术语“...调用”(call by ...)都是用来描述方法参数行为的标准计算机科学术语。
Java语言总是使用传值调用。这也意味着方法得到的只是所有参数值的拷贝。因此,方法不能修改传递给它的任何参数变量的内容。
例如:下面的调用:
double percent = 10;
harry.raiseSalay(percent);
不管这个方法如何实现,方法调用后,percent的值仍然会是10。
主我们稍微仔细地研究一下这种情况。假设一个方法要使方法参数的值增至3倍:
public static void tripleValue(double x);//不能工作
{
x = 3 * x;
}
然后,我们调用此方法:
double percent = 10;
tripleValue(percent);
然而,这样做无法达到目的。方法调用后,percent的值仍旧是10。下面是有关的执行过程:
1)x被初始化为percent值的一个拷贝(即10)。
2)x被增至3倍,变成30。但percent仍旧是10(参见下图)。
3)方法结束后,参数变量x不再使用。
┌────┐
┌───│值的拷贝│
↓ └────┘
percent= 10
▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂
x= 30
↑ ┌─────┐
└───│值增至3倍│
└─────┘
方法参数共有两种:
●基本类型(数字、布尔值);
●对象引用。
方法不能改变基本类型的参数。但对于对象参数来说,情况则有所不同。我们可以很容易地实现一个方法,把员工的薪金增至3倍。
public static void tripleSalary(Employee x)//能够工作
{
x.raiseSalary(200);
}
执行调用:
harry = new Employee(...);
tripleSalayr(harry);
的具体工作过程如下:
1)x被初始化为harry值的一个拷贝,即一个对象引用。
2)向此对象引用应用raiseSalary方法。x和harry都指向的那个Employee对象的薪金被提高了200%.
3)方法结束后,参数变量x不再使用。但对象变量harry继续指向薪金被增至3倍的那个对象。
可以看到,实现改变对象参数状态的方法很容易。实际上,这种方式也很普遍。后面的原因很简单。方法得到对对象引用的一个拷贝,原来的对象变量和这个拷贝所指向的是同一个对象。
很多程序设计语言(尤其是C++和Pascal)有两种参数调用的方法:传值调用和传引用调用。所以,有一些程序员(不幸的是,其中有些甚至是某些书的作者)声称Java程序设计语言对对象使用的是传引用调用。这种理解是错误的。由于,这种误解的普遍性,我们在下面举出一个反例来进行详细阐述。
下面的方法用来交换两个员工对象:
public static void swap(Employee x, Employee y)//无法工作
{
Employee temp = x;
x = y;
y = temp;
}
如果Java程序设计语言对对象使用的是传引用调用,那么这个方法将会达成目标:
Employee a = new Employee("Alice"..);
Employee b = new Employee("Bom"..);
swap(a,b);
//
可是,这个方法事实上并没有改变存储在变量a和变量b中的对象引用。swap方法中的x和y参数被初始化为这两个引用的拷贝。然后,这个方法交换两个拷贝。
//
Employee temp = x;
x = y;
y = temp;
但最终这么做是徒劳无功的。当方法结束后,参数变量x和y就被丢弃了。原来的变量a和b仍旧指向方法调用前各自所指向的对象。
上面的讨论说明Java程序设计语言中并不向对象使用引用调用。实际上,对象引用是通过值来传递的。
下面归纳了Java程序设计语言中利用方法参数可以做到和不能做到的几种情况:
●方法不能修改基本类型(即数字或布尔型)的参数。
●方法可以修改对象参数的状态。
●方法不能让对象参数指向新的对象。
-----------------------
C++既有传值调用,也有传引用调用。传引用调用只需在引用参数前标上&。例如,可以容易实现修改其引用参数的方法void tripleValue(double& x)或者void swap(Employee& x, Employee& y)。
----------------------