本次分享在Java面试中超高频出现的话题。成员变量与局部变量,无论是社招还是校招,关于这俩的考点总是层出不穷,面试官也总喜欢用它们做“陷阱题”。
Java中的成员变量和局部变量的区别吗?成员变量和局部变量主要有以下几点不同,定义位置不同。成员变量定义在类中,但在方法构造器或代码块之外,局部变量定义在方法构造器或代码块中。生命周期不同。成员变量的生命周期和对象绑定,对象存在时,它就存在,局部变量的生命周期则很短。方法执行完后,他就被销毁了。假如有个类实例化了多次,每个实例都有自己的一份成员变量,但局部变量不受影响,运行结果默认值不同。
成员变量有默认值,比如int类型的默认值是零,引用类型的默认值是null,局部变量没有默认值,必须显示初始化,否则会报错。修饰符支持不同成员变量,可以被public ,protected,private等访问修饰符修饰,还可以用static,final等关键字,局部变量不能使用访问修饰符,只能用final修饰。如果看到局部变量,用public修饰,基本可以确定是语法错误。存储位置不同,成员变量存储在堆内存,而局部变量存储在栈内存。局部变量存储在栈中,因此存取速度快,但生命周期短,成员变量存储在堆中,可以跟随对象的生命周期。
假如成员变量和局部变量同名,代码如何处理?在这种情况下,局部变量会屏蔽成员变量,但可以通过this关键字访问成员变量。
在一个多线程环境中,成员变量和局部变量分别会有什么表现?
成员变量是线程不安全的,因为多个线程可以访问同一个对象的成员变量,容易导致数据竞争。局部变量是线程安全的,因为他们存储在每个线程的栈中,不会被其他线程共享。
成员变量和局部变量的区别并不难记,但在不同的场景中,他们的表现会有很多细微差别,所以平时要多加练习才能在面试中轻松应对。