如果创建一个自定义的 Person类 如下:
class Person{ public String name; public int age; Person(String name,int age) { this.name = name; this.age = age; } }
然后再main方法中:
class test{ public static void main(String[] args) { Person Alex = new Person("Alex",25); Person refer = Alex; refer.name = "KKKKKK"; refer.age = 99999; System.out.println(Alex.name); System.out.println(Alex.age); } }
从main方法中可以看出,我创建了一个引用类型Person类型的变量Alex指向new Person("Alex",25), 接着创建了 Person类型的变量 refer,令refer与Alex指向同样的实例。
然后,我改变了refer.name 和refer.age , 在打印出Alex.name和Alex.age 后,我发现Alex.name和Alex.age的值分别和 refer.name,refer.age一致。
如果对java中的引用类型不了解的话,可能会感觉很奇怪。为什么明明只改变了refer.name 和refer.age,为什么Alex.name和Alex.age 也同样发生了改变?
其实java的引用类型类似于C语言中的指针,Person Alex = new Person("Alex",25);的意思是令引用类型变量Alex 指向 实例(也可以称作对象)new Person("Alex",25), Person refer = Alex; 的意思是令同类型引用类型变量refer 指向 Alex所指的实例, 也就是说此后refer 和Alex 指向了相同的实例。接着我改变了refer.name和refer.age,这就是对refer所指向的那个实例内部的属性进行了修改。由于Alex 也指向这个实例,故发现Alex.name和Alex.age 也同样变成了"KKKKKK" 和 99999 。
所以我们处理java中的引用类型变量时,要多加小心。如果两个引用类型变量refer1,refer2指向了同一个实例的时候,如果通过refer1.属性名对实例进行内部属性修改,那么refer2.属性名也产生了改变。
同理,java中的方法传参也是这样。 比如 对于方法void function(Person p),我传参数为
function(Alex) ,那么,这就相当于 Person p = Alex, 与上文main方法中的
Person refer = Alex 完全一致。 如果在function方法中,令p.age = 160,那么,main方法中的
Alex.age 也会同样发生改变。
如果要让上图中的链表的 P 转而指向R的话,就要输入
head.next = R;
如果输入 Node temp = Q; (Q是一个实例)
temp.next = null;
就可以让Q从这个链表上脱离,从而达到删除结点Q的效果。
共同学习,写下你的评论
评论加载中...
作者其他优质文章