Theme NexT works best with JavaScript enabled
0%

String类的继承问题

^ _ ^

Q & A

String类能被继承吗,为什么?

不能,String类是由final修饰的类,因此不可被继承。
String类被设计成由final修饰的类,原因主要有两个,一是设计,而是效率:

  • 设计:final类中的所有方法都是final类型,这样将方法锁定,可以防止任何继承类修改它的意义和实现;
  • 效率:final方法使用内嵌机制,可以提升效率。但这样的机制在方法体很大时可能会耗费更多时间反而使效率降低,所以现在使用final方法一般只取决于设计原因。

String类可以被更改吗,为什么?

不能,String类中用于保存字符串值的成员变量是由final修饰的char型数组。数组被final修饰后,数组本身不可被改变,但其数组元素本身可以被改变,因此,char数组是不能被扩容的。由于这个char数组也被private修饰,且String没有提供修改这个数组成员的方法,因此程序员也不能操纵String的每个字符。
String类被设计为不可变类的原因主要有两个,一是效率,二是安全:

  • 效率:String类有一个成员变量hashcode,用来判断两个字符串值是否相等。String值不变,hashcode值就不变,缓存hashcode值才有意义;
  • 安全:String类常被作为网络连接,文件操作等参数类型,倘若改变,会出现意想不到的结果。

final修饰的作用

  • 修饰基本类型变量:类型的值不可改变
  • 修饰对象类型变量:指向对象的引用不可改变指向,对象本身可以改变
  • 修饰方法:使方法不可被重写
  • 修饰类:类不可被继承

编程测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void equalTest() {
System.out.printf("\nequalTest\n");
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println("s1 == s2? " + (s1==s2)); \\ true
System.out.println("s1 == s3? " + (s1==s3)); \\ false
System.out.println("s1 equals s2? " + s1.equals(s2)); \\true
System.out.println("s1 equals s3? " + s1.equals(s3)); \\true
}
public void concatEqualTest() {
System.out.printf("\nconcatEqualTest\n");
String s1 = "Hello Word";
String s2 = "Hello " + "Word";
System.out.println("s1 == s2? " + (s1==s2)); \\true
System.out.println("s1 equals s2? " + s1.equals(s2)); \\true
String hello = "Hello ";
String s3 = hello + "Word";
System.out.println("s1 == s3? " + (s1==s3)); \\false
System.out.println("s1 equals s3? " + s1.equals(s3)); \\true
}