final修改符

  二. final修改符

               final具有"不可改变的"含义,它可以修饰非抽象类、非抽象成员方法和变量。
               . 用final修饰的类不能被继承,没有子类;
               . 用final修饰的方法不能被子类的方法覆盖;
               . 用final修饰的变量表示常量,只能被赋一次值;

               final不能用来修饰构造方法,因为"方法覆盖"这一概念仅适用于类的成员方法,
           而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖关系. 
           因此用final修饰构造方法是无意义的。父类中用private修饰的方法不能被子类的
           方法覆盖,因此private类型的方法默认是final类型的。

               1. final类

                  继承关系的弱点是打破封装,子类能够访问父类的方法,而且能以方法覆盖
          的方式修改实现细节。在以下情况下,
                  可以考虑把类定义为final类型,使得这个类不能被继承。

                  . 子类有可能会错误地修改父类的实现细节;
                  . 出于安全,类的实现细节不允许有任何改动;
                  . 在创建对象模型时,确信这个类不会再被扩展;

                  例如JDK中java.lang.String类被定义为final类型;

               2. final方法;
 
                  某些情况下,出于安全原因,父类不允许子类覆盖某个方法,
          此时可以把这个方法声明为final类型。例如在
                  java.lang.Object类中,getClass()方法为final类型。

               3. final变量:
          final修饰的属性(成员变量)赋值的位置:
            非静态的成员变量
            1.声明的同时
            2.匿名代码块
            3.构造器(类中出现的所有构造器)

            静态的成员变量
            1.声明的同时
            2.static代码块          
  
                  a. final可以修饰静态变量、实例变量、局部变量;
                  b. final变量都必须显示初始化,否则会导致编译错误;
                     1) 静态变量,定义变量时进行初始化或者static代码块中赋值;
                     2) 实例变量,可以在定义变量时,或者在构造方法中进行初始化;
                  c. final变量只能赋一次值。

                     public class Sample {
                            private final int var1 = 1;
                            public Sample() {
                                 var1 = 2;                //编译出错,不允许改变var1实例变量的值;
                            }

                            public void method(final int param) {
                                 final int var2 = 1;         
                                 var2++;                  //编译出错,不允许改变var2局部常量的值
                                 param++;                 //编译出错,不允许改变final类型参数的值;
                            }
                     }

                     public class Sample {
                            final int var1;               //定义var1实例常量
                            final int var2 = 0;           //定义并初始化var2实例常量
   
                            Sample() {
                                  var1 = 1;               //初始化var1实例常量
                            }

                            Sample(int x) {
                                  var1 = x;                //初始化var1实例常量
                            }
                     }       
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值