1.String类不可被继承
#String类定义
public final class String
- String被定义为final类,final(最终的意思)定义的类不可以被继承。
2.String是不可变对象
#String属性
private final char value[];
private int hash;
- final修饰的成员变量的引用(引用类似于指针,对应对象的内存地址)不可以被更改,引用对象不变。字符数组value存储String的元素,被final修饰,所以value的引用不可变。
- private修饰的成员变量不可以被外部类直接使用,所以不能在外部直接修改成员变量,value被private修饰,所以不能在外部通过引用直接修改成员变量。
- value仅提供了查询和比较的方法,没有提供提供公有的修改方法,所以不能在外部通过公有方法修改成员变量value。
3.下面的代码创建了几个String实例?
String s = new String("Hello world!");
通过下面的构造方法分析问题
#String构造方法
public String(String orginal){
this.value = orginal.value;
this.hash = orginal.hash;
}
- “hello world” 是orginal的实例,orginal的value和hash引用赋给新的对象的value和hash引用。说明存在了两个String实例,引用对应同一个内存地址。
- 如果orginal变量已经存在,则只是创建了一个新的对象引用,将orginal的对象引用赋给了新创建的s。
4.对比数组,String获取长度的方法?
String s = new String("Hello world!");
int sLen = s.length();
int[] arr = {1,3,5,7};
int arrLen = arr.length;
- 可以看到String s是通过length()方法获取的长度,而int数组arr的length属性获取的长度。
- 不过看下面的源码就知道因为String使用char数组value存储的元素,因为value私有,所以提供了公有的length方法,两者获取长度的方法本质是一样的。
#String源码
private final char value[];
public int length() {
return value.length;
}