A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尤圣回 中级黑马   /  2012-9-17 23:12  /  1381 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我知道java是通过值传递方式 ,有没有类似c的对象传递呢

4 个回复

倒序浏览
java中有
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。参数是原始类型int,long,float,byte,char,double、boolean、short等等。
对象的传递其实也是引用的传递。  
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
例如
string不是基本类型,但是传递参数时,为什么其原参数值没有发生变化,下面我们来看看new出String对象的那小段代码(String类中),也就是String类的构造函数:
publicString(String original) {   
  
        int size = original.count;   
  
        char[] originalValue = original.value;   
  
        char[] v;   
  
      if (originalValue.length > size) {   
  
             int off = original.offset;   
  
             v = Arrays.copyOfRange(originalValue, off, off+size);   
  
        } else {   
  
            v = originalValue;   
  
        }   
  
        this.offset = 0;   
  
        this.count = size;   
  
        this.value = v;   
  
}  
注意里面的char[],对String的存储实际上通过char[]来实现的。不知道你还记不记得在Java API中定义的那些基本类型的包装类。比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和String在这种情况下的表现是相同的。
下面就是传递对象的一小段代码:
public class ZhiShu {   
    public  void setMapValue(Map maps){   
        maps.put("3","3");   
        maps.put("4","4");   
    }   
    public static void main(String[] args) {   
        ZhiShu z=new ZhiShu();   
        Map map=new HashMap();   
        map.put("1","1");   
        map.put("2","2");   
        z.setMapValue(map);   
        System.out.println(map);   
    }   
}  



评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 回帖时,语言请尽可能的简洁扼要,继续加油.

查看全部评分

回复 使用道具 举报
java中是可以传对象的,javaBean的方式,ssh框架中pojo等,hebernate中对象映射,实体类等
回复 使用道具 举报
我晕 又一个这问题

Java中可以说是 只有值传递。
实参如果是基本数据类型或者是常量字符串,String str="abc",传递给形参,就相当于将实参的值赋值给形参,调用方法,如果改变了这个值,那也只是形参的值改变,方法执行结束,在内存中释放,实参值不变。
实参如果是引用数据类型,那传递给形参的同样是值,同样也是个赋值动作。什么值?地址值。因为引用数据类型变量的值本身就是一个内存地址值,是一个堆内存中一个new出来的东西的引用。在方法中,形参改变有两种情况,一种改变是仍然对这个地址引用操作,也就是说对这个引用指向的对象进行操作,方法执行过程中,形参的值,就是这个地址引用没变,那么,操作改变的就是所指向的对象。这就叫形参改变实参。
还有另一种情况,当形参的值改变了,比如又=new xxx,这个动作,形参的值改变了,那么方法的操作都是针对的这个新new出来的东西,而不对实参值指向的对象有所影响,所以此时,形参又不该变实参。

总之:
实参是基本数据类型和字符串,形参的值无论改不改变,方法的执行都不影响实参。
实参是引用数据类型,形参的值变化,方法的执行不影响实参,不变化,方法的执行影响实参。

不管实参是什么类型,都可以称为值传递,都是将实参的值赋值给形参 前者是数据的值,后者是所指向对象的地址值,即对象的引用

PS:我估计外国就没想这么复杂,这个问题画图能很好的理解,为什么迷惑呢?就是因为中国汉字的博大精深。值,可以是数据本身的值,也可以是地址值。也许在外国,应该有不同的英文单词来阐述这两个值。一个值,一个引用。这个没必要太纠结于概念,知道内存中的变化就可以了。

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 要用耐心~

查看全部评分

回复 使用道具 举报
我觉得java中传递的比较多的应该是对象引用吧,现在的主流面向对象oop编程不就是传递的java对象吗。
如果往后学一些,到时候会慢慢明白,以后的编程主要是面向接口编程:
把类的方法抽象出来,然后形成一个接口。然后在别的业务类中,把接口作为属性,然后里面的方法参数也都是用的接口做参数。
这样开发的软件才好扩展和好维护

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 新手报到,鼓励下,加油!!!.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马