使用 final 的注意事项

 一、final修饰成员变量  

 与普通成员变量不同的是,final成员变量(包括实例Field,类Field) 必须由程序员显示的初始化,系统不会默认的为它初始化;

     例如:

       public class Test{

             final int age;

           {

                System.out.print(age)   //就会报错

                age=6;

                System.out.print(age); //这个是正确

            }

           public static void mian(String[] args){

                 new Test();

          }

       }

二、final局部变量

         如果final修饰的局部变量,如果局部变量没有赋值的的,可以赋值一次,接下来就不可以赋值了,如果final修饰的局部变量,已指定默认值,则不能进行再一次进行赋值;

      例如:

               public class Test{

                      public void init(final int a){

                          a=2;//错误

                     }

                   public static void main(String[] args){

                         final String str="hello";

                        str= "JAVA";  //错误

                       final Double d;

                      d=3.4;//正确

                       

                 }

              }

三、final修饰基本类型变量和引用类型变量区别

      public class Test{

            public static void mian(String[] agrs){

                   final int[] arr={5,6,7,8};

                   arr[2]=-8;//正确

                   arr=null;//错误

                  final Person p=new Person();

                  p=null  //错误

             }

      }

   final 修饰的基本类型变量,引用类型变量,可以修改引用变量所引用的对象的内容,但是不能对引用的对象重新赋值操作;

   四、可替换成“宏替换”的final的变量

         java使用常量池管理以前用过的字符串直接量,例如执行String a="java" ;语句之后系统的字符串会缓存一个字符串"java" 如果程序在执行String b="java" 系统会让b直接指向字符串池中的"java"字符串,因此a==b 为true

例如:

   String s1="疯狂java";

   String s2="疯狂"+"java";

   System.out.print(s1==s2);   //true  从String常量池中缓存中去找到了

  String c=new String("hello");

  String d=new String("hello");

  System.out.print(c==d); //false 创建对象不同

  System.out.print(a.equals(b))  //true 比较的是字符串的内容

  String a="hello";     

  String b="hello";

  System.out.print(a==b);  //true

 String str="疯狂Java";

 String str1="疯狂";

 String str2="Java";

 String str3=str1+str2;

System.out.print(str==str3);  //false,因为str2和str3均为变量所以没有在编译的时候就确定下来值,所以为false;如果str2和str3采用final修饰则就会变为true,在编译的时候就确定下来了。

五、final修饰的方法:

   final修饰的方法既不可以被重写,但可以被重载;

六、final修饰的类:

   final修饰的类不能有子类,如果父类是final则子类就不能去继承它否则会报错;

七、不可变的类:

    例如String就是一个final修饰的类,没有为String提供一个可以修改的方法;

    

   

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值