锁定老帖子 主题: corejava辅导(5--2)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-03
final修饰符,可以修饰变量,方法,类
1, final修饰变量(包括局部变量和实例变量) 被final修饰的变量就成为常量(常量名应当大写),一旦赋值不能改变,(可以在初始化时直接赋值,在构造方法里可以为其赋值,只能在这两种方法里二选一,常量不能不赋初值),常量没有默认初始值,final修饰符常和static修饰符一起使用。 例: public class Test{ private static final int TESTNUM=2; //有final修饰符这个变量就变成了常量 …… }
2,final修饰方法,final修饰的方法将不能被子类覆盖,保持方法的稳定不能被覆盖。
例: public class Test{ public final int test(){ 。。。。。。 } }
3,final修饰类,final修饰的类将不能被继承。final类中的方法也都是final的。
例: public final class Test{ public final int test(){ 。。。。。。 } }
注意:final,不能修饰构造方法,在父类中有常量属性,子类中使用常量属性时不会进行父类的类加载。静态常量如果值可以确定,就不会加载该类,不能确定则会加载该常量所在的类。
不变模式,对象一旦创建属性就不会改变。用final修饰类(强不变模式),用final修饰属性(弱不变模式)。
不变模式的典型体现:java.lang.String类,不变模式可以实现对象的共享(可以用一个对象实例赋值给多个对象引用。)
池化的思想,把需要共享的数据放在池中(节省空间,共享数据)
String类可以用“ ”中的字面值创建对象。String类中,以字面值创建时,会到Java方法空间的串池空间中去查找,有就返回串池中字符串的地址,并把这个地址付给对象引用。没有会在串池里创建一个字符串对象,并返回其地址付购对象引用,当另一个以字面值创建对象时会重复上述过程。
堆空间中创建String类的对象,不会有上述的过程。
例: public class TestString{ public static void main(String[] args){ String str1=”abc”; String str2=”abc”; String str3=new String(“abc”); System.out.println(str1==str2); System.out.println(str1==str3); } } 结果是: true false//在堆空间中创建的Srting是不会从串池中引用的
String类中的intern()方法会将在堆空间中创建的String类对象中的字符串和串池中的比对,有相同的串就返回这个串的串池中的地址。
不变模式在对于对象进行修改,添加操作是使相当麻烦的,会产生很多的中间垃圾对象。创建和销毁的资源的开销是相当大的。
String类在字符串连接时的效率很低,因为它所产生的对象的属性是不能修改的,连接字符串时就只能创建新的对象。
对于很多的字符串连接,应当使用StringBuffer类或者是StringBuilder,使用这个类的对象来进行字符串连接时,不会有多余的中间对象生成,优化了效率。 例: 上边的字符串连接如果使用StringBuffer如下的写法 public class TestString{ public static void main(String[] args){ String str=“a”+“b”+”c”; /* 以上创建String对象str时会创建1个中间String对象“ab” 如果使很多字符串相连就是穿件出许多的中间对象 */ StringBuffer str=new StringBuffeter(); //使用StringBuffer就不会有中间对象生成 str.append(“a”); str.append(“b”); str.append(“c”); String strs=str.toString();
} } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 945 次