Java-改变变量名的指向

变量:代表了一段内存储存的数据
变量名:代表了指向这段内存的代号

一对一

变量和变量名比较模糊,可以无视区别,比如

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 !!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值