作者:nnngu
GitHub:https://github.com/nnngu
博客園:http://www.cnblogs.com/nnngu
簡書:http://www.reibang.com/users/1df20d76ea5c
知乎:https://www.zhihu.com/people/nnngu/posts
不能被繼承蜂桶,因?yàn)镾tring類有final修飾符,而final修飾的類是不能被繼承的盛撑。
Java對String類的定義:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
// 省略...
}
final修飾符的用法:
1.修飾類
當(dāng)用final修飾一個類時(shí)檬姥,表明這個類不能被繼承曾我。final類中的成員變量可以根據(jù)需要設(shè)為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法穿铆。
2.修飾方法
使用final修飾方法的原因有兩個您单。第一個原因是把方法鎖定,以防任何繼承類修改它的含義荞雏;第二個原因是效率虐秦。在早期的Java實(shí)現(xiàn)版本中,會將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用凤优。但是如果方法過于龐大悦陋,可能看不到內(nèi)嵌調(diào)用帶來的任何性能提升。在最近的Java版本中筑辨,不需要使用final方法進(jìn)行這些優(yōu)化了俺驶。
因此,只有在想明確禁止該方法在子類中被覆蓋的情況下才將方法設(shè)置為final棍辕。
注:一個類中的private方法會隱式地被指定為final方法暮现。
3.修飾變量
對于被final修飾的變量,如果是基本數(shù)據(jù)類型的變量楚昭,則其數(shù)值一旦在初始化之后便不能更改栖袋;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象抚太。雖然不能再指向其他對象塘幅,但是它指向的對象的內(nèi)容是可變的。
final和static的區(qū)別:
很多時(shí)候會容易把static和final關(guān)鍵字混淆尿贫,static作用于成員變量用來表示只保存一份副本电媳,而final的作用是用來保證變量不可變∏焱觯看下面這個例子:
1 public class Demo1 {
2 public static void main(String[] args) {
3 MyClass myClass1 = new MyClass();
4 MyClass myClass2 = new MyClass();
5 System.out.println(myClass1.i);
6 System.out.println(myClass2.i);
7 System.out.println(myClass1.j);
8 System.out.println(myClass2.j);
9
10 }
11 }
12
13 class MyClass {
14 public final double i = Math.random();
15 public static double j = Math.random();
16 }
運(yùn)行結(jié)果:
0.3222977275463088
0.2565532218939688
0.36856868882926397
0.36856868882926397
每次打印的兩個j值都是一樣的匾乓,而i的值卻是不同的。從這里就可以知道final和static變量的區(qū)別了又谋。