java方法参数传值传引用的一点看法

  java 跟C++不同,java的方法参数都是传值,没有传引用。很多人都以为是传引用,而且这种错误的观点很普遍,今天在这里具体分析一下。方法参数有基本类型,如int等,另外一种类型是OBJECT,对象。详细说一下方法参数是对象的,跟C++不同的是,JAVA方法参数传对象,传的是对这个对象引用的一份拷贝,即地址值,跟原来的引用都是指向同一个对象。所以说,JAVA方法参数传的都是值。

程序一 传的对象值是改变的。
public class Test
{
public Test()
{
int [] count={5};
change(count);
System.out.println(count[0]);

}
public void change(int [] counts)
{
counts[0]=6;
System.out.println(counts[0]);
}
public static void main(String [] args)
{
Test t=new Test();
}

}

程序一中,输出结果都是6,change(count); 把对象的一份引用拷贝传给change(),这个拷贝跟原来的引用都是指向同一个对象。所以改变引用拷贝的值,对象的值也跟着改变。
 程序2,传的对象值不改变
class Foo{
int i=0;
}
public class A{
public static void main(String args[]){
Foo f=new Foo();
add(f);
System.out.println(f.i);
}
public static void add(Foo f){
f=new Foo();
f.i++;
}
}

输出结果是0
程序2中,也是传一份引用的拷贝,但在 add()方法中,f=new Foo(); NEW出了一个新的对象,所以引用的拷贝指向了一个新的OBJECT。原来的值还是没有改变。
 程序3 String 不改变,数组改变
public class Example{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);
  }
  public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
}

程序3输出的是 good and gbc.
String 比较特别,是因为java在传string的时候把string当成基本类型来处理 。所以值是不变的。

时间: 2024-12-02 16:15:26

java方法参数传值传引用的一点看法的相关文章

Java方法参数是引用调用还是值调用?_java

方法调用(call by) 是一个标准的计算机科学术语.方法调用根据参数传递的情况又分为值调用( call by reference ) 和引用调用( call by value ) .江湖上有很多关于这两种调用的定义 ,最通常的说法是传递值的是值调用,传递地址的是引用调用.这其实很不恰当,这种 这些说法很容易让我们联想到Java的对象参数传递是引用调用,实际上,Java的对象参数传递仍然是值调用 . 我们首先用一段代码来证实一下为什么Java的对象参数传递是值调用. public class

内部类-java方法参数的修饰符问题

问题描述 java方法参数的修饰符问题 java在写方法时,为什么有的方法参数用final修饰? 还有就是内部类存在的意义是什么? 也就是说方法中的内部类和类中的内部类各有什么应用场景(请有实战经验的大神各自举个例子)? //问题补充(关于方法中的内部类) 我的意思是: pubic class TestClass{ public void fun(){ public class Test1{ //........ } } } 解决方案 为了实现一些内容,常常需要这么玩: public void

java方法参数什么时候可以省略数据类型声明

问题描述 java方法参数什么时候可以省略数据类型声明 有时候我看到方法参数是一个匿名对象,那么匿名对象属于什么数据类型,是String类型吗,为什么没有数据类型的声明呢 解决方案 你说的匿名对象,是因为匿名对象本身是有返回值的,而返回值的类型恰好是构造方法的参数类型 A a = new A(new B()): 解决方案二: 看方法的定义,里面包含参数类型. 不知道你说的匿名对象是什么,直接调用构造函数,你可以从构造函数类名知道类型,如果是匿名类,那么这个类型是编译器产生的,实现了参数需要的接口

获取Java方法参数的名称

最近有个需求,需要获取java方法参数的名称,网上查了下,然后自己也实践了下,总结出3点: 1.能不能获取方法参数的名称取决于class文件里是否含有LocalVariableTable. 2.javac编译生成的class文件不含有LocalVariableTable,但是eclipse编译生成的class文件却含有LocalVariableTable. 3.有2种方式可以获得,用Asm和Javassist,Asm的性能略高. 贴代码: maven依赖: <dependency> <g

java方法参数带双引号和不带双引号的区别

问题描述 java方法参数带双引号和不带双引号的区别 java方法参数带双引号和不带双引号的区别 比如map.put( " billNum","订单编号", +stateStr); 为什么会有加号,难道方法参数还可以是一个运算表达式 解决方案 map.put( " billNum","订单编号", +stateStr); 这么写不合法 map.put( " billNum","订单编号"

java方法参数-java当中的方法的参数可以有n个不同类的对象吗

问题描述 java当中的方法的参数可以有n个不同类的对象吗 java当中的方法的参数可以有n个不同类的对象吗 java当中的方法的参数可以有n个不同类的对象吗 解决方案 可以 比如 button.setText(String str,int num,Mode mode) 解决方案二: DWR中Java方法的参数及返回值.对象javabean 解决方案三: 方法传参又没有限制,想传什么传什么! 解决方案四: 还可 test( Object... objs) 省略号里想传几个传几个

Java方法的参数和返回类型统一为Map是否合理?

问题描述 开发一个Web应用. 主管要求 所有业务逻辑的Java方法参数和返回类型必须统一为Map类型.理由是将来扩展时接口不用修改.而且有多返回值的方法也好处理但是这样一来.返回一个String都要写成 Map resultMap = doXXXXX(paramMap);String result = (String)resultMap.get("resultStr");返回一个VOMap resultMap = doXXXXX(paramMap);XXXXVO resultVO =

java方法调用参数问题

问题描述 java方法调用参数问题 最近在看<java编程思想>,其中有一句话:[图片说明](http://img.ask.csdn.net/upload/201507/02/1435824299_513845.png) 既然参数是引用类型,于是我就做了一些试验: class A{ public void f(Integer i){ i = 10; } public void h(Data data){ data.i=2; data.str="abc"; } } class

java多线程 参数已经传入构造方法 进入run方法时参数却被改变

问题描述 java多线程 参数已经传入构造方法 进入run方法时参数却被改变 请教各位大神:我在for循环里面执行线程,遇到一个问题,代码如下:private static final ExecutorService executors = Executors.newScheduledThreadPool(10);......for(...){executors.execute(new PublishThread(map));}PublishThread实现了Runnable方法,它有一个私有成