一.涉及到的概念
1.final修饰基本类型变量,代表这个变量不能再被改变,但是要是修饰引用类型的变量则,引用变量不能改变,但是引用所指向的对象是可以改变的。
2.final会固定栈中的引用变量的位置,但是堆中的对象因为一直由栈指针指向,所以final 的修饰作用对于引用变量所引用的对象没有什么与影响。
3.final修饰的类不能被继承,没有子类,final修饰的类中的方法默认是final的。
4.字符串常量存储在方法区中的常量池,如:“abc” , “杯子” 等, 常量具有唯一性。
二.String
1)第一种方法声明String类型的变量
String str1 = “abc”;
对于这种方法是在类加载器加载之后,常量池就有了"abc"这个常量,当执行到这一步的时候,这个常量"abc"的地址就会被赋值给str1,然后引用变量 str1直接指向常量池的的"abc"。
2)第二种方法声明String类型的变量 (需要创建对象)
String() 的括号内可以传 ,空值 ,字符串 ,数组等。
以下以传递数组为例来创建一个"abc"的字符串:
//先创建一个char类型的数组date用来储存 ‘a’ , ‘b’ , ‘c’ 这三个字符。
char date[] = new char[];
date[0] = “a”;
date[1] = “b”;
date[2] = “b”;//把date传入构造方法String中
String str2 = new String(date);//在String的构造方法中进行的内容
//引用类型的变量value被fianl修饰,表示value的内容不可变(value的内容是地址),但是value地址所指向的对象(数组的内容)可变。 (概念 1 2)
private final char[] value;//这个作用是把date数组中的内容复制到value数组中
public String(char date[]) {
this(date, 0, date.length, null);
}
四.总结
1.我们用等号 “==” 比较 str1 和 str2的时候比较的是它们的地址,a0001 和 a002 是不可能想等的,但是用equals比较的时候比较的是地址所指向的内容 “abc” 和 “abc” 此时二者是相等的。
2.str2指向的是value的地址,由于value被final修饰所以str2的内容(value的地址),但是value数组的元素是可变的。