Java的引用是Java和C++的主要区别之一,也是Java比C++好用的地方,Java语言明确说明取消了指针,这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用.而这也是很多程序员在编程中常常忽略了对象与引用的区别.更是公司笔试的时候最喜欢考的地方.
        CSDN上的Java引用的笔试题:
 
第一题:      
  public class Test {
    public static void changeStr(String str){
        str="welcome";//1
    }
    public static void main(String[] args) {
        String str="1234";//2
        changeStr(str);
        System.out.println(str);
    }
}
答案是"1234".
        详细分析:
Java中函数参数传递是值传递,在C语言以后的都是这样的,关键是传进来的值是什么。
①如果参数是基础类型,如int型的,则传进来的是int型变量的值,这个值放在堆里的。
举个例子:
void fun(int i){};
int i = 5;
fun(i);
传进fun函数的是5;
②如果参数是引用类型。如String型的,则传进来的是String型变量的值,这个值放在栈里,此值是该变量将要指向的对象的地址,实际的对象是放在堆的。
举个例子:
void fun(String str0){};
String str = "Hello";
fun(str);

fun()方法调用时第一件事就是,做了一个赋值操作:str0 = str;
这个操作的结果就是将str变量的值传给str0变量的值,也就是使得str0也指向str所指向的对象。对str0所指向的对象做修改操作,也就是对str所指的对象做修改。

第二题:
1.class X2{
2.         public X2 x;
3.         public static void main(String[] args){
4.         X2 x2=new X2();
5.         X2 x3=new X2();
6.         x2.x=x3;
7.         x3.x=x2;
8.         x2=new X2();
9.         x3=x2;
10.         doComplexStuff();
11.}
12.}
after line 9 runs,how many objects are eligible for garbage collection?
A.0  B.1  C.2  D.3  E.4

这道题比较BT,首先要搞清楚Java的内存分配机制
Java中 内存有2部分:stack和heap
stack:存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中
Heap:存放用new产生的数据
TIJ中说了Java的GC就是首先从stack和静态分配区的ref查找heap中对应的对象
,如果heap对象没有找到相应ref就回收它.
可以这样理解在第7行的时候都是正常的
x2 -> A
x2.x -> B
x3 -> B
x3.x -> A
问题就在8行,给x2 重新new出来一个对象,x2的成员对象x就是null了,x3.x还是指向A,A还是没有给释放.
9行,x3也给重新赋值了和x2指向同一个对象,A和B都不到在stack上的ref了,所以
A和B给回收了
answer :C