从C++转到JAVA的朋友 是不是有一种被骗的感觉?? [关于JAVA所谓的引用] 补一句我的理解: JAVA中参数传递方式就只有一种. [按值传递]. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 JAVA中没有取值运算(*), 所有C中所谓的Out参数在JAVA中是不可能实现的. 对不对?? 各位大哥. java中传递参数的方式当然不止一种拉,还有传址方式的 JAVA中没有取值运算(*), 所有C中所谓的Out参数在JAVA中是不可能实现的. 对不对??======================================java可以返回一个对象或者一个数组啊 上面两位兄弟: 我看的JAVA书也说有两种传递方式. 但我理解他们本质上是一样的. 都是[按值传递] 看下面的代码 // 理解为引用还是指针先不说. 只是一个名词而已. 大家理解的语义应该是一样的. Integer MyInteger = new Integer(10); // 定义一个引用 void foo(Integer Param) // 定义函数foo 参数按引用传递吗??? 不是的. 这里只是 告诉编译器 这个foo接收一个引用作为参数. 但其传递这个引用的参数传递方式是[按值传递] { } 所有才会有上面 classtype = 10 的结果. 如果真的是按引用传递 那么应该是classtype = 11! Java的引用是一种受保护的指针。第一、Java的引用总是指向某个东东的;没有指向对象就指向null,不会出现什么都不指向的野指针;使用引用永远也不会导致程序崩溃第二、Java引用指向的地址的变更对程序员是透明的;系统可能把一个对象从一个地方搬到另一个地方,但是你不必知道地址的变化——这对GC很重要第三、Java不允许对引用进行类似C++中指针运算那样的运算;原因很简单,因为这可能是你的引用无效啊 jimshen(jimshen) : 当然 靠返回值也可以实现Out参数的功能! 谢谢 Polarislee(北极星) 的指点 好像C++区分指针和引用的吧?不过他的引用和java不太一样 所有“小型数据” 比如 int char float .... 都是传 值所有“大型数据” String 、类 、数组 …… 都是传 地址不管是用指针实现传地址,还是真的把内存地址的值传来传去,我值知道它没有把 实体 传过去。就是这样,小菜鸟的理解 :) java不许编程人员采用值调用(call-by-value)或引用调用(call-by-reference)传递每一个参数。基本数据类型总是采用值调用,其他对象都是引用。 比如Object o=new Object();o总是指向Object();但o并不是地址,因此不是指针,o有点类似于c++里的*o,但你永远无法取得o 我快要疯了private static double seekNearestPoint( Point p, Point[] points, Point nearestPoint) { if(points.length <= 1 && p.equals(points[0])) throw new IllegalArgumentException(); nearestPoint = p.equals(points[0]) ? points[1] : points[0]; /*Do not use statement "double leastDistance = p.distance(returnPoint);" since it need square root, or statement "double leastDistanceSq = p.distanceSq(points[0]);" for it will first search varible points and then points[0]. */ double leastDistanceSq = p.distanceSq(nearestPoint); for (int i = 1, n = points.length; i < n; i++) { if(p.equals(points[i])) continue; double distanceSq = p.distanceSq(points[i]); if(leastDistanceSq > distanceSq) { nearestPoint = points[i]; leastDistanceSq = distanceSq; } } System.out.println(nearestPoint); return leastDistanceSq; }以上nearestPoint是我要返回的第二个值,由于我想返回两个值,就只有这样写了,但是我在函数类不打印时显示为java.awt.Point[x=23,y=111]然后我调用该函数: Point aR = null; double distanceSqAR = seekNearestPoint(a, points1, aR); System.out.println(distanceSqAR + " " + aR);显示为52.0 null。这简直把我弄胡了一下午,我一直以为是传引用,结果发现根本不是引用。 你们这班从C++过来的阿灿,public static void main(String[] arv){ String b = "sdfsfd"; a(b) out.println(b) >> "sdfsfd"}public void a(String s){ //在里面 s是一个变量,和外面的b指向同一个Object s = "456"; } //相当于 String b = "sdfsfd"; String s = b; s = "456" //b当然还是b但如有对象class ABC{ int a = -1; public ABC(){}}public static void main(String[] arv){ ABC b = new ABC(); a(b) out.println(b.a) >> 2}public void a(ABC s){ //在里面 s 是一个变量,和外面的b指向同一个Object s.a = 2 >>指向的Object.a = 2}这相当于ABC b = new ABC();ABC s = b;s.a = 2(就是b.a = 2) I fu le you, ClassType = new Integer(11);只是把实参ClassType的地址改变了而已,哪儿是改了ClassType的值啊,当然打印出来的ClassType还是原值了。 没那么复杂与神秘。只理解一点就够了:Java里传递的永远都是值(value),对于对象类型,传递的是reference value,对于原始类型,传递的是value。都是value。这样,以上任何问题都好理解了。大家可以对我信任,我于2003年3月8日通过了SCJP 1.4英文版的考试,成绩是93%。 java的对象是传地址,基本的数据类型是只传值 . . int i;object o=new object();public void add(int i,object o){i++;o.convert();}add方法完后i没变,可o的方法确实被调用, 强烈同意 feiyuegaoshan(飞跃) Java里传递的永远都是值(value),对于对象类型,传递的是reference value,对于原始类型,传递的是value。 什么叫Reference Value?这么说指针也可以叫指针Value, 呵呵。 shenyiwen(沈亦文) : 我认为是这样的. 有指针Valueint *p = new int(10);在这里 编译器给P分配了存储空间 (现在一般为32Bit) , 在这个存储空间存储的值. 就是指针Value 原来所谓的Pass by value,是为了区别传过去的参数是原参数的一个拷贝还是其地址。若是拷贝则为按值传送,若是地址则为引用(或指针)。如果把这个地址也强叫作Value当然也没错,因为计算机里面万物最终都是二进制码,不过这样一来Value一词在这里就毫无意义了。 DataOutputStream中的writeChars(String)方法是怎么实现的? 求一正则表达式? 把分给需要的人(二) 如何用java做类似QQ的局域网即时通讯工具?给点提示。 再次帮忙! 一个小问题,大侠帮忙! 散分-------------100.在线, 一个很简单的问题,高分!!! 大家来选我做班竹! resin tomcat weblogic 中怎样配置才能进行文件的操作 java中怎么把数字格式成字符,比如1变成‘01’ 再问一个关于鼠标的问题!
各位大哥.
======================================java可以返回一个对象或者一个数组啊
我看的JAVA书也说有两种传递方式. 但我理解他们本质上是一样的. 都是[按值传递]
看下面的代码
// 理解为引用还是指针先不说. 只是一个名词而已. 大家理解的语义应该是一样的.
Integer MyInteger = new Integer(10); // 定义一个引用
void foo(Integer Param) // 定义函数foo 参数按引用传递吗??? 不是的. 这里只是 告诉编译器 这个foo接收一个引用作为参数. 但其传递这个引用的参数传递方式是[按值传递]
{
} 所有才会有上面 classtype = 10 的结果. 如果真的是按引用传递 那么应该是classtype = 11!
第一、Java的引用总是指向某个东东的;没有指向对象就指向null,不会出现什么都不指向的野指针;使用引用永远也不会导致程序崩溃
第二、Java引用指向的地址的变更对程序员是透明的;系统可能把一个对象从一个地方搬到另一个地方,但是你不必知道地址的变化——这对GC很重要
第三、Java不允许对引用进行类似C++中指针运算那样的运算;原因很简单,因为这可能是你的引用无效啊
当然 靠返回值也可以实现Out参数的功能!
所有“大型数据” String 、类 、数组 …… 都是传 地址不管是用指针实现传地址,还是真的把内存地址的值传来传去,
我值知道它没有把 实体 传过去。就是这样,小菜鸟的理解 :)
o总是指向Object();
但o并不是地址,因此不是指针,o有点类似于c++里的*o,但你永远无法取得o
private static double seekNearestPoint(
Point p, Point[] points, Point nearestPoint) {
if(points.length <= 1 && p.equals(points[0]))
throw new IllegalArgumentException();
nearestPoint = p.equals(points[0]) ? points[1] : points[0];
/*Do not use statement "double leastDistance =
p.distance(returnPoint);" since it need square root, or statement
"double leastDistanceSq = p.distanceSq(points[0]);" for it will first
search varible points and then points[0].
*/
double leastDistanceSq = p.distanceSq(nearestPoint);
for (int i = 1, n = points.length; i < n; i++) {
if(p.equals(points[i]))
continue;
double distanceSq = p.distanceSq(points[i]);
if(leastDistanceSq > distanceSq) {
nearestPoint = points[i];
leastDistanceSq = distanceSq;
}
}
System.out.println(nearestPoint);
return leastDistanceSq;
}以上nearestPoint是我要返回的第二个值,由于我想返回两个值,就只有这样写了,但是我在函数类不打印时显示为java.awt.Point[x=23,y=111]
然后我调用该函数:
Point aR = null;
double distanceSqAR = seekNearestPoint(a, points1, aR);
System.out.println(distanceSqAR + " " + aR);
显示为52.0 null。
这简直把我弄胡了一下午,我一直以为是传引用,结果发现根本不是引用。
public static void main(String[] arv)
{
String b = "sdfsfd";
a(b)
out.println(b) >> "sdfsfd"
}public void a(String s)
{
//在里面 s是一个变量,和外面的b指向同一个Object
s = "456";
} //相当于
String b = "sdfsfd";
String s = b;
s = "456"
//b当然还是b但如有对象
class ABC
{
int a = -1;
public ABC(){}
}public static void main(String[] arv)
{
ABC b = new ABC();
a(b)
out.println(b.a) >> 2
}public void a(ABC s)
{
//在里面 s 是一个变量,和外面的b指向同一个Object
s.a = 2 >>指向的Object.a = 2
}这相当于
ABC b = new ABC();
ABC s = b;
s.a = 2(就是b.a = 2)
只是把实参ClassType的地址改变了而已,哪儿是改了ClassType的值啊,当然打印出来的ClassType还是原值了。
只理解一点就够了:Java里传递的永远都是值(value),
对于对象类型,传递的是reference value,
对于原始类型,传递的是value。都是value。
这样,以上任何问题都好理解了。大家可以对我信任,我于2003年3月8日通过了SCJP 1.4英文版的考试,成绩是93%。
.
.
int i;
object o=new object();
public void add(int i,object o){
i++;
o.convert();
}
add方法完后i没变,可o的方法确实被调用,
对于对象类型,传递的是reference value,
对于原始类型,传递的是value。
int *p = new int(10);
在这里 编译器给P分配了存储空间 (现在一般为32Bit) , 在这个存储空间存储的值. 就是指针Value