当前位置:  技术问答>java相关

关于变量及对象的引用问题!~

    来源: 互联网  发布时间:2015-10-19

    本文导语:  class Test{      public static void stringReplace(String t){        t=t.replace('j','l');       }      public static void main(String args[]){         String textString=new String("java");       stringReplace(textString);       Sys...

class Test{
     public static void stringReplace(String t){
       t=t.replace('j','l');
      }
     public static void main(String args[]){  
      String textString=new String("java");
      stringReplace(textString);
      System.out.println(textString);
     }
}
========================================================

结果是
java

我想知道怎样做才能输出lava。

还有这是对于对象的引用问题,
对于primitive的变量如何做到引用。
就是说类似这样的C++语句能不能在java中实现:
void modifier(int& a){
     a = NEW_VALUE;
}

|
在不同的java新闻组中,参数是传值还是传址一直是一个经常被争辩的话题。误解的中心是以下两个事实:
1、对象是传引用的
2、参数是传值的
这两个能够同时成立吗?一个字:是!在java中,你从来没有传递对象,你传递的仅仅是对象的引用!
一句话,java是传引用的。然而,当你传递一个参数,那么只有一种参数传递机制:传值!
通常,当程序员讨论传值和传引用时,他们是指语言的参数传递机制,c++同时支持这两种机制,
因此,以前使用过c++的程序员开始好像不能确定的java是如何传参数的。java语言为了事情变得简单只支持参数传值的机制。
java中的变量有两种类型:引用类型和原始类型。当他们被作为参数传递给方法时,他们都是传值的。
这是一个非常重要的差别,下面的代码范例将说明这一点。在继续前,我们有必要定义一下传值和传引用。
传值意味着当参数被传递给一个方法或者函数时,方法或者函数接收到的是原始值的副本。
因此,如果方法或者函数修改了参数,受影响的只是副本,原始值保持不变。
关于java中的参数传递的混乱是因为很多java程序员是从c++转变过来的。c++有引用和非引用类型的变量,
并且分别是通过传引用和传值得。java语言有原始类型和对象引用,那么,按照逻辑,java对于原始类型使用传值而对引用是传引用的,
就像c++一样。毕竟,你会想到如果你正在传递一个引用,那么它一定是传引用的。这是一个很诱惑人的想法,但是是错误的!
在c++和java中,当函数的参数不是引用时,你传递的是值得副本(传值)。但是对于引用类型就不同了。在c++中,当参数是引用类型,
你传递的是引用或者内存地址(传引用),而在java中,传递一个引用类型的参数的结果只是传递引用的副本(传值)而非引用自身。
这是一个非常重要的区别!java不考虑参数的类型,一律传递参数的副本。仍然不信?如果java中是传引用,那么下面的范例中的swap
方法将交换他们的参数。因为是传值,因此这个方法不是像期望的那样正常工作。
class Swap
{
 public static void main(String args[]) 
 { 
  Integer a, b; 
  int i,j;
  a = new Integer(10);
  b = new Integer(50); 
  i = 5;
  j = 9; 
  System.out.println("Before Swap, a is " + a); 
  System.out.println("Before Swap, b is " + b); 
  swap(a, b); 
  System.out.println("After Swap a is " + a); 
  System.out.println("After Swap b is " + b); 
  System.out.println("Before Swap i is " + i); 
  System.out.println("Before Swap j is " + j); 
  swap(i,j); 
  System.out.println("After Swap i is " + i);
  System.out.println("After Swap j is " + j); 
 }
 public static void swap(Integer ia, Integer ib)
 {
  Integer temp = ia; 
  ia = ib; 
  ib = temp; 
 }
 public static void swap(int li, int lj) 

 int temp = li; 
 li = lj; 
 lj = temp; 
 } 


上面程序的输出是: 

Before Swap, a is 10 
Before Swap, b is 50
After Swap a is 10 
After Swap b is 50 
Before Swap i is 5 
Before Swap j is 9 
After Swap i is 5 
After Swap j is 9 

因为swap方法接收到的是引用参数的副本(传值),对他们的修改不会反射到调用代码。

译者注:在传递引用和原始类型时还是有不同的,考虑以下的代码: 
class Change
{
 public static void main(String args[]) 
 { 
  StringBuffer a=new StringBuffer("ok"); 
  int i;
  i = 5;
  System.out.println("Before change, a is " + a); 
  change(a); 
  System.out.println("After change a is " + a); 
  System.out.println("Before change i is " + i); 
  change(i); 
  System.out.println("After change i is " + i);
 }
 public static void change(StringBuffer ia)
 {
  ia.append(" ok?");
 }
 public static void change(int li) 

 li = 10; 
 } 
}

程序的输出为:

Before change, a is ok
After change a is ok ok?
Before change i is 5
After change i is 5

即如果传递的是引用,那么可以修改引用对象的内容,这个改变会影响到原来的对象,而传递的如果是原始类型则不会有影响。
这个也是造成误解的原因之一吧。

    
 
 

您可能感兴趣的文章:

  • php中检测变量是否是一个对象的is_object函数介绍及用法举例
  • 声明对象的时候想用字符窜变量怎么办?
  • 请问用Vector定义的变量/对象有什么用?
  • 请问大侠们怎么检测session对象某个变量负了值!!??比如^
  • 扩展jQuery对象时如何扩展成员变量具体怎么实现
  • PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
  • PHP面向对象之旅:深入理解static变量与方法
  • python共享引用(多个变量引用)示例代码
  • 关于环境变量的设置和引用
  • 怎么引用SESSION变量的值?
  • linux 如何在两个.c文件中引用对方的变量。
  • 模块编程中对内核全局变量引用的问题
  • 在JSP代码中怎么引用javascript中的变量???急!!!
  • 菜鸟问题--怎么引用这个变量?
  • Makefile中引用变量时大括号和小括号有啥区别?
  • 如何引用内核模块中的变量
  • 如何在html标签的属性里引用一个jsp变量
  • C#: 引用变量与数值变量的区别
  • 求助,JSP与Servlet之间可以引用全局变量吗(Session范围的)?
  • PHP变量的定义、可变变量、变量引用、销毁方法
  • 在静态上下文中不能引用非静态变量 this WindowAdapter e=new MyAdapter();why?
  • 浅谈PHP变量作用域以及地址引用问题
  • To masterz():本人愚笨,向你再请教一个问题 在静态上下文中不能引用非静态变量 this
  • PHP变量作用域与地址引用问题解析
  • php中检测变量是否是一个对象的is_object函数介绍及用法举例 iis7站长之家
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c/c++预处理命令之预定义变量
  • 将父类变量强制赋予子类变量时,发生了什么?比如子类的成员变量,假如父类中有不存在子类中有的成员变量的情况,那么子类中该变量是否默认取值???
  • Linux下如何查看,设置环境变量并立即生效
  • 请问在win2000的环境变量中,administrator的用户变量与系统变量有什么区别??
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 大家快来帮帮我,关于JAVA的类变量:一定在定义成STATIC变量(即静态变量)吗?
  • 实例变量和类变量
  • 枚举类型变量如何定义与初始化,如何给该变量加入新值?
  • jsp中的变量和javascript中的变量可以比较吗
  • shell编程,如何将变量中的环境变量转换为绝对值
  • 程序中获取的环境变量能够根据Linux系统中相应环境变量而变化吗?
  • C#:(变量)字段和局部变量的作用域冲突
  • 如何清空session变量的值,或者删除一个session变量
  • 全局结构体变量和全局结构体指针变量
  • 动态库中的变量(全局和自动变量)在什么地方存储,内存在什么位置分配?
  • 菜鸟问题:如何设置application变量和session变量?
  • 怎么查看自己的shell的环境变量,和root的环境变量,solaris系统
  • linux动态链接库里全局变量和静态变量会导致动态库不可重入吗?
  • linux 下设置环境变量 使用了setenv 和putenv 在程序结束以后 发现变量又变回去了
  • 请问:环境变量的值 一般前面加$就可以了,但有时又用{}将环境变量括起来,它们有什么区别啊?
  • 如何将字符型变量转化为InputStream型变量?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3