关于值类型和引用类型的问题

本文深入探讨了Java中值类型和引用类型的区别,通过具体示例解释了局部变量和对象属性在方法调用中的行为差异,以及如何影响原始数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于值类型和引用类型的问题

1求输出结果

public class TestA {
	int i ;
	void change(int i){
		i++;
		System.out.println(i);
	}
	void change1(TestA t){
		t.i++;
		System.out.println(t.i);
	}
	public static void main(String[] args) {
		TestA ta = new TestA();
		System.out.println(ta.i); //0
		ta.change(ta.i);//1
		System.out.println(ta.i); //0
		ta.change1(ta);  //1
		System.out.println(ta.i);//1
		
	}
}

这里的change方法传入的是ta.i的值,并在change方法中又声明了一个i,这个i是局部变量,存储在栈中,而ta对象中的属性值都存在堆中。change方法对栈中的i做了一系列操作后,方法结束,i出栈,对ta没有影响。
而change1方法传入的是ta对象,在参数列表中又新建了一个t对象,并将它指向ta,此时t和ta指向的是堆中相同的数据,因此对t做的操作会影响到ta对象的属性值,但是如果把t指向其他对象的话,并不会对ta造成影响。

2

class Value{
    int i = 15;
}
public class Test{
public static void main(String argv[]) {
	Test t = new Test();
	t.first();
}

public void first() {
	int i = 5;
	Value v = new Value();
	v.i = 25;
	second(v, i);
	System.out.println(v.i);
}

public void second(Value v, int i) {
	i = 0;
	v.i = 20;
	Value val = new Value();
	v = val;
	System.out.print(v.i + " " + i);
}
}

A.15 0 20
B.15 0 15
C.20 0 20
D.0 15 20
A is correct.
这题重点在于first方法调用second方法,传入一个value类型的v和一个int类型的i。
在second方法的参数列表又声明了一个新的value对象v,并指向first方法传入的v,此时两个v存在在栈中,并指向同一个堆中的数据,因此,对v中属性的操作会改变堆中的数据,但是如果把second中的v指向其他对象,对于first中的v没有影响,仅仅是本来v(second)–>v(fiest) to v(second)–>val(second);这里要是有一张堆栈图就好了,可惜我不会画

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值