变量:代表了一段内存储存的数据
变量名:代表了指向这段内存的代号
一对一
变量和变量名比较模糊,可以无视区别,比如
public class Temp {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a);
System.out.println(b);
}
}
输出
1
2
由于每个变量名各自对应了唯一的变量,所以构成了一一对应的关系,这样也就不用在太意变量和变量名的区别,可能认为变量名就代表了变量本身
一对多
但是如果两个变量名指向了同一个变量,那么这种时候需要注意它们之间的区别,比如
class People{
private int age;
private String name;
public People(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "People [age=" + age + ", name=" + name + "]";
}
}
public class Test1 {
public static void main(String[] args) {
//改变基本类型变量名的指向
int a=1; //a指向1
int b=a; //b指向1的副本(值传递)
b=2; //改变指向
System.out.println(a);
System.out.println(b);
//改变引用类型变量名的指向
People people1=new People(1,"bill");
People people2=people1; //people1和people2同时指向一号人 (引用传递)
people1=null; //改变指向
System.out.println(people1);
System.out.println(people2);
}
}
输出
1
2
null
People [age=1, name=bill]
可以看到在基本类型中,实际上变量根本不可能两个变量名指向同一个变量,指向的也是副本,而引用类型中才可能两个变量名指向同一个变量
应用1
变量交换算法
public class Temp {
public static void main(String[] args) {
int a=1;
int b=2;
int temp=a; //temp和a指向了同一个变量
a=b; //让变量名a指向变量名b所指向的变量
b=temp; //让变量名b指向temp变量名所指向的变量
System.out.println(a);
System.out.println(b);
}
}
输出
2
1
对于这种问题最好的方式是通过画图的方式辅助思考,如下图
应用2
给链表头增加元素的时候
public void push(Item item) {
Node oldfirst = first; //oldfirst和first同时指向了同一个变量
first = new Node(); //first指向了新的变量
first.item = item;
first.next = oldfirst;
n++;
assert check();
}
完整代码:https://algs4.cs.princeton.edu/13stacks/LinkedStack.java.html
###总结:
不论是基本类型,还是引用类型的两个变量名指向了同一个变量,改变任何一个变量名的指向,对另一个变量名,以及变量本身都没有影响
Happy learning !!