关于这个问题实在不知道应该在什么地方发帖,自己经常在这里看帖子,就发到这里来了,希望大家不要介意。最近在论坛上看一些别人写的帖子结果吧自己给看糊涂了,引用,变量和对象之间的关系弄的有点混淆了。
后来自己做了一些试验,加上一些自己的理解得出下面的结论,不知道对不对,还请高手指点一下。首先,我可不可以把c中的指针理解成引用
如下:
 int a=2,b=2,*p=a,*q=b;
 printf("\n%d%d\n",p,q);//-44,-42
 a=3;
 printf("\n%d%d\n",p,q);//-44,-42只是一段c代码 ,在这里我认为 a,b,p,q是变量,所谓变量就是持有一段内存的标记。
这里a,b,p,q他们都持有一段内存 ,而3(开始的时候是2) ,2,-44,-42是他们持有的那段内存里的数据也就是他们的值。而引用它包括了一个标记和一段内存,也就是说在这里单纯的p,q不算是引用只能是变量他们只是一个标记但是加上他们持有的那段
内存里的值之后就变成了一个引用,*p是a标记的那段内存的引用,*q就是b标记的那段内存的引用了。这就是我理解的引用,我把
它分成两部分标记那部分就先叫‘引用变量’存储空间那部分先叫它引用的‘地址域’吧(后面还会用到)。之所以定义了两个变量和两个指针是因为还有一个问题,就是在一个帖子里看到有栈空间内数据共享的说法,  int a = 3; 
  int b = 3; 
   编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3
   这个字面值的地
   址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地
   址。这样,就出现
   了a与b同时均指向3的情况。 
这是那个帖子里得原话,很明显这种说法是错误的,首先a,b是变量而不是引用,如果是变量的话,他们各自都有自己的内存空间不
管里面的内容相不相等,他们都不会共享同一段内存空间,但是如果要是引用的话应该可能可以实现只要他们的值空间里的地址是同
一个就可以了,我自己还没弄明白就不妄下结论了。至于为什么a==b会是true我认为就是因为他们的值相等。不过那个帖子说的是
java我却是用c验证的不知道是不是一样,我只是提出自己的观点,至于对错还请大家评论一下吧!!!不过a,b都是变量而不是引
用这一点是肯定的。
接下来说一下对象与引用,一下的代码都是用的java
A a1;
这句话创建了一个A类的引用,它的引用变量是 a1  ,由于没有初始化所以地址域的数据为null,只有在创建类的属性的时候可以不
给它初始化,在方法中声明类引用的时候是必须要初始化的。
a1=new A();
创建一个A类的对象并将它与a1关联,同时将new A()创建的对象的地址传给a并存到a的地址域中,这时如果再建一个A的引用:
A a2=a1;
我认为这条语句的作用是将a1地址域的数据复制给a2的地址域,这样a1和a2就同时指向同一个对象,而a1==a2为true就是因为
他们的地址域相等所以才判断他们引用的是同一个对象,就像上面我说变量a==b为true因为他们的值相等一样,我认为==运算符是
通过判断变量或者引用的数据域的数据是否相等来判断变量是否相等或者引用是否引用了同一个对象。以上就是我个人对于 引用、变量、和对象之间关系的一点看法,如果有什么错误的地方还请各位不吝赐教,万分感激。这里我还有一个问题想要问一下
String s=new  String("abc");
就是关于这条语句创建了两个对象的问题,我知道肯定是要在堆中创建一个对象"abc",至于还有一个是s的引用对象我就不太明白了
还请大家帮忙解释一下“引用对象”这个概念。

解决方案 »

  1.   

    JAVA的引用是C++中的指针,而不是C++的引用
    C++的引用在JAVA中没有对应的概念
      

  2.   


    肯定是要在堆中创建一个对象"abc",  ---这句话是错误的。堆中创建的是一个String对象。
    一个String对象里面包括3个重要的成员:
    /** The value is used for character storage. */
    private final char value[];/** The offset is the first index of the storage that is used. */
    private final int offset;/** The count is the number of characters in the String. */
    private final int count;
    当new  String("abc")的时候,堆里面创建了一个String对象,然后要给这些成员变量赋值,赋什么值呢?
    offset肯定就是0,count肯定是3,关键就是这个value[]。
    可选方案有2种:
    1、先value=new char[3],然后copy "abc"这个对象的value到这个新对象的value;
    2、直接把"abc"这个对象的value附给新对象的value,让它们指向同一个字符数组看看JDK String.java的源代码就知道了。它用的是2。
      

  3.   

    1楼说的很好
    int a = 3; 
      int b = 3; 
    的确不是引用
    要注意JAVA中基本数据类型都不是引用(也就是说除了基本类型 其他的都是引用 比如数组 甚至类 方法等)
    另外这里你写的例子并不严谨
    把int a = 3; 
      int b = 3; 改成
      int a = 127; 
      int b = 127;与
      int a = 128; 
      int b = 128;看看
    这里的问题又涉及到JAVA虚拟机内部优化的细节(精华贴里有相关的讨论贴去看看把)
    楼主问的问题蛮好 值得鼓励(最讨厌直接要代码的了)  
      

  4.   

    引用:相当于C或者C++中的指针,存放的是地址,放在栈中.
    对象:是类的一个实例,即new出来的东东,放在堆中.
    变量:与C和C++一样是一个声明,存放的是值.
      

  5.   

    额 写错了 上面改写成127 和128都是true
    扯远了 具体的看看http://blog.csdn.net/kao331431214/archive/2008/12/01/3421681.aspx
      

  6.   

    A variable is a storage location and has an associated type, sometimes called its compile-time type, that is either a primitive type (§4.2) or a reference type (§4.3). A variable's value is changed by an assignment (§15.26) or by a prefix or postfix ++ (increment) or -- (decrement) operator (§15.14.2, §15.14.3, §15.15.1, §15.15.2).变量分为2种:基本类型变量和引用类型变量。
    4.12.1. Variables of Primitive Type
    A variable of a primitive type always holds a value of that exact primitive type.4.12.2. Variables of Reference Type
    A variable of a class type T can hold a null reference or a reference to an instance of class T or of any class that is a subclass of T. A variable of an interface type can hold a null reference or a reference to any instance of any class that implements the interface.