关于局部变量的问题

weikeli19 2019-07-23 09:51:31
我想问一下 方法里的形参如果是引用类型的 那么它是不是局部变量?比如 public void a(Person p){} 其中p是引用类型 那么方法中的这个p是不是局部变量?还有出了方法这个p会不会被销毁(垃圾回收)? 谢谢 问题很简单
...全文
200 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
maradona1984 2019-07-23
  • 打赏
  • 举报
回复
引用 7 楼 weikeli19 的回复:
[quote=引用 6 楼 weixin_40290083 的回复:] 即然是引用,出了方法后JVM会根据情况对P进行回收的,因为P本身也是变量,它也要分配内存空间,但是在P的内存空间内存放的是目标对象的地址。当在方法中对P进行操作时,实际是对目标对象的操作,是访问了目标对象的内存空间。当方法执行完成后,回收的是P变量本身的内存空间,但是不是目标变量的内存变量,相当于方法通过P间接的操作了目标变量。
就是说当方法执行完成后 回收的是形参里的引用变量p是吧?[/quote] 个人觉得回收这个词不够准确,出作用域之后栈中的p的内存空间会被释放,但p指向的对象并不会回收 回收会联想到垃圾回收,这个两种释放内存的机制不一样
weikeli19 2019-07-23
  • 打赏
  • 举报
回复
引用 6 楼 weixin_40290083 的回复:
即然是引用,出了方法后JVM会根据情况对P进行回收的,因为P本身也是变量,它也要分配内存空间,但是在P的内存空间内存放的是目标对象的地址。当在方法中对P进行操作时,实际是对目标对象的操作,是访问了目标对象的内存空间。当方法执行完成后,回收的是P变量本身的内存空间,但是不是目标变量的内存变量,相当于方法通过P间接的操作了目标变量。


就是说当方法执行完成后 回收的是形参里的引用变量p是吧?
weixin_40290083 2019-07-23
  • 打赏
  • 举报
回复
即然是引用,出了方法后JVM会根据情况对P进行回收的,因为P本身也是变量,它也要分配内存空间,但是在P的内存空间内存放的是目标对象的地址。当在方法中对P进行操作时,实际是对目标对象的操作,是访问了目标对象的内存空间。当方法执行完成后,回收的是P变量本身的内存空间,但是不是目标变量的内存变量,相当于方法通过P间接的操作了目标变量。
qq_39936465 2019-07-23
  • 打赏
  • 举报
回复
发现我说的还是有点问题。还是上段程序体会一下。

public class test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p;
		p = new Person("zhangsan");
		System.out.println("main方法--->"+p);
		a(p);
		System.out.println("main方法--->"+p);
	}

	public static void a(Person p) {
		p.setName("lisi");
		System.out.println("a方法--->"+p);
		p = new Person("wangwu");
		System.out.println("a方法--->"+p);
	}

}

class Person {
	private String name;

	/**
	 * @param name
	 */
	public Person(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}

}


main方法--->Person [name=zhangsan]
a方法--->Person [name=lisi]
a方法--->Person [name=wangwu]
main方法--->Person [name=lisi]
可以这样理解参数是外部引用值的一个副本,和外部值指向同一个内存地址,当方法结束时,该参数会被销毁。
weikeli19 2019-07-23
  • 打赏
  • 举报
回复
引用 1 楼 qq_39936465 的回复:
[quote=引用 楼主 weikeli19 的回复:]
我想问一下 方法里的形参如果是引用类型的 那么它是不是局部变量?比如 public void a(Person p){} 其中p是引用类型 那么方法中的这个p是不是局部变量?还有出了方法这个p会不会被销毁(垃圾回收)? 谢谢 问题很简单


这个p是参数和局部变量还是有区别的,要看具体的使用情况。要看这个p是全局变量还是局部变量。[/quote]
我做了个实验 就算类成员有相同的引用变量p 也不影响啊 所以根本就不用去追究是全局变量还是局部变量
weikeli19 2019-07-23
  • 打赏
  • 举报
回复
引用 1 楼 qq_39936465 的回复:
[quote=引用 楼主 weikeli19 的回复:]
我想问一下 方法里的形参如果是引用类型的 那么它是不是局部变量?比如 public void a(Person p){} 其中p是引用类型 那么方法中的这个p是不是局部变量?还有出了方法这个p会不会被销毁(垃圾回收)? 谢谢 问题很简单


这个p是参数和局部变量还是有区别的,要看具体的使用情况。要看这个p是全局变量还是局部变量。[/quote]
你回答的好像不太对啊 我认为哦 只要是传入方法的参数 我没说外面的参数 我就说单单这个p 应该是个局部变量 你说呢 ?
yety123 2019-07-23
  • 打赏
  • 举报
回复
p方法加载时创建入栈,然后方法结束后出栈,等待回收。
qq_39936465 2019-07-23
  • 打赏
  • 举报
回复
引用 楼主 weikeli19 的回复:
我想问一下 方法里的形参如果是引用类型的 那么它是不是局部变量?比如 public void a(Person p){} 其中p是引用类型 那么方法中的这个p是不是局部变量?还有出了方法这个p会不会被销毁(垃圾回收)? 谢谢 问题很简单
这个p是参数和局部变量还是有区别的,要看具体的使用情况。要看这个p是全局变量还是局部变量。
weixin_40290083 2019-07-23
  • 打赏
  • 举报
回复
引用 8 楼 maradona1984 的回复:
[quote=引用 7 楼 weikeli19 的回复:] [quote=引用 6 楼 weixin_40290083 的回复:] 即然是引用,出了方法后JVM会根据情况对P进行回收的,因为P本身也是变量,它也要分配内存空间,但是在P的内存空间内存放的是目标对象的地址。当在方法中对P进行操作时,实际是对目标对象的操作,是访问了目标对象的内存空间。当方法执行完成后,回收的是P变量本身的内存空间,但是不是目标变量的内存变量,相当于方法通过P间接的操作了目标变量。
就是说当方法执行完成后 回收的是形参里的引用变量p是吧?[/quote] 个人觉得回收这个词不够准确,出作用域之后栈中的p的内存空间会被释放,但p指向的对象并不会回收 回收会联想到垃圾回收,这个两种释放内存的机制不一样[/quote] 嗯,你的解释应该更准确。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧