老题新谈 - 传值还是传引用(传地址)

来源:互联网 发布:淘宝客服骂人怎么处理 编辑:程序博客网 时间:2024/05/22 08:28

java中有两种类型数据, 一类是原始数据类型(primitive type) , 也叫基本数据类型, 即byte, short, int , long, double, float, boolean ,char;

一类是数据类型,  即Object对象(及其子类)和 数组对象

对于基本数据类型,无论在java还是c/c++中, 传入方法中的参数的值都是原始(变量)值的一个copy, 在方法体内修改传入参数的值,  并不会影响原始变量的值,这

如果传入的是一个对象, 表面看来是传递了对象的引用(这一点其实是没错的, 但是还不够精准), 我们可以通过该引用, 修改其指向的对象(我们的代码中随处可见这种情况 ) ,但其实这里传递的仍然是一份原始变量值的copy,只不过这个copy很特殊, 它既不是8中基本数据之一, 也不是任何对象类型, 而是"引用"(我们可以理解为类型为引用的一种数据类型,它本质上是一个地址), 粗略的说就是一个对象地址的copy

看两个例子,就可以明白这一点

例一

public class MainTest extends TestCase {
  
   public void testOne(){
    StringBuffer sb 1= new StringBuffer("aaa");
    modify(sb1); 
    System.out.println(sb1.toString());   
   }
  
   private void modify(StringBuffer sb) {
    sb.append("bbb");
   }
}
输出结果是我们期望的"aaabbb", 这是容易理解的

例二

public class MainTest extends TestCase {
  
   public void testOne(){
    StringBuffer sb1 = new StringBuffer("aaa");
    modify(sb1); 
    System.out.println(sb1.toString());   
   }
  
   private void modify(StringBuffer sb) {

    sb = new StringBuffer();
    sb.append("bbb");
   }
}
结果是"aaa", 而不是我们期望的"bbb",因为sb = new StringBuffer();让sb指向了另一个新产生的StringBuffer对象,而不是原始的sb1对象, 所以如果在方法内要置空一个传入的对象,这也是不可能的,企图通过sb = null让sb1对象为null是不可能的, 如果一定要在方法内实现这种功能, 我们只能添加StringBuffer的一个置空方法,比如setNull(), 修改引用指向的对象才是有效的, 修改指向对象的引用是徒劳的   

综上所述, 在java中其时没有严格意义上的传地址(传引用), 一切都是.

原创粉丝点击