java面试题网站:www.javaoffers.com
基础知识大家都知道,final可以用在类上,则该类不能被继承,final用在成员变量上则必须给定一个终量,final在方法上不能被重写。这里我要说的事final在类上和不在类上的区别。很简单看例子
代码:
public class NUllTest {
public static void main(String[] args) {
ElecUser user = new ElecUser(); //ElecUser 类没有final修饰
user.setName("gg");
ElecUser user2 = user;
System.out.println(user.getName());//输出 gg
System.out.println(user2.getName());//输出gg
user.setName("jj")
System.out.println(user.getName());//输出 jj
System.out.println(user2.getName());//输出jj
总结:
普通类(没有被final修饰的类)对象,被n个变量(没有用final修饰)引用时,如过这个对象的属性发生改变,
则n个变量所对应的对象属性也会发生改变,因为他们在堆内存中指向的是同一块内存对象。
user = null;
// System.out.println(user.getName());//这里不能输出
System.out.println(user2.getName());//输出jj
总结:
user = null; 在堆内存中的意思是,user变量不在指向原来的对象内存,而user2变量任然还在指向那块内存。
所以null是让变量与堆内存中的对象断开链接地址。对原对象没有影响。并且null也不会再堆内存中重新开辟空间。
//-----------------------------测试String类(该类用final修饰)-------------------------------
String str = new String("fdsa");
String str2 = str;
System.out.println(str.hashCode());//输出3138444
System.out.println(str2.hashCode());//输出3138444
str = "fdaa";//为str重新链接一个堆对象,而str2依然链接 原来的对象,不会受影响。
System.out.println(str.hashCode());//输出3137886
System.out.println(str2.hashCode());//输出313844
}
}