一、final数据

在 java编程语言中,有时候需要告知编译器一段数据是不变的编译期常量。对于这种情况,编译器可以将此常量值带入需要用到它的计算式子当中,这种在编译时 执行计算式的方法减轻了运行时的开销。通常,这类常量数据都是基本类型的数据,并赋予关键字final,同时在对此常量定义时需要进行赋值。

值得注意的是:对于基本类型,使用final关键字将使数值恒定不变;而对于对象引用,final则是使引用恒定不变。一旦引用被初始化为指向一个对象时,它也就无法再指向另外一个对象,然而该对象本身是可以被修改的。通常,对于一个既是static又是final的域只占一段不能改变的存储空间。

下面的例子验证了final数据的含义。

class Hank

{

       int i;

       public Hank(int i){this.i=i;}

}

public class FinalTest

{

       private String s;

       public FinalTest(String s){this.s=s;}

       private final int value=20;

       private static final int INT_1=50;

       public static final int  INT_2=60;

       static final int INT_3=70;

       private final Hank h1=new Hank(1);

       private static final Hank h2=new Hank(2);

       private Hank h3=new Hank(3);

       private final int[] a={1,2,3,4,5};

       public String toString()

       {

              return s+": "+"INT_2= "+INT_2;

       }

       public static void main(String[] args)

       {

              FinalTest ft1=new FinalTest("ft1");

              //ft1.value++;常量值不能被修改

              ft1.h1.i++;//对象引用不能改变,但是其对象本身是可以修改的

              ft1.h3=new Hank(2);

              //ft1.h1=new Hank(1);常量对象引用不能再指向另一个对象引用

              for(int i=0;i<ft1.a.length;i++)

              {

                     ft1.a[i]++; //对象引用不能改变,但是其对象本身是可以修改的

                     System.out.println(ft1.a[i]);

              }

              //ft1.a=new int[3];常量对象引用不能再指向另一个对象引用

       }

}

 

二、空白final

    被声明为final但又没有给定初值的域即为空白final,编译器确保使用前必须初始化空白final。比如:

class Blank

{

    private int i;

    Blank(int i){this.i=i;System.out.println("Blank.i="+this.i);}

}

public class BlankFinal

{

    private final int i;//blank final

    private final Blank b;//blank final reference

    BlankFinal()

{

i=1;b=new Blank(1);//使用前必须初始化

System.out.println("BlankFinal.i="+this.i);

}

    BlankFinal(int i)

{

this.i=i;b=new Blank(i); //使用前必须初始化

System.out.println("BlankFinal.i="+this.i);

}

    public static void main(String[] args)

    {

           new BlankFinal();//Blank.i=1;BlankFinal.i=1;

           new BlankFinal(2); //Blank.i=2;BlankFinal.i=2;

    }     

 

三、final参数

       Java允许在函数参数列表中以声明的方式将参数指明为final,这使得在函数体当中修改参数引用所指向的对象变得不合法。比如说:

class Args

{

       public void f(String s){System.out.println(s);}

}

public class ArgsFinal

{

       void has(final Args arg)

       {

              //arg=new Args();不能修改final参数

              arg.f("with final");

       }

       void dnthas(Args arg)

       {

              arg=new Args();//能修改final参数

              arg.f("without final");

       }

       public static void main(String[] args)

       {

              ArgsFinal af=new ArgsFinal();

              Args ar=new Args();

              af.has(ar);//with final

              af.dnthas(ar);//without final

       }

}

 

四、final

       如果不想继承某个类,则可以考虑将此类设置成final的形式。即是说,程序员对该类不能做任何改动,同时也意味着它不会有子类。比如:

       Class Base{ …}

       Final Class SubClass{…}

       //! Class Derived extends SubClass{…}不能由finalSubClass导出新类

需要注意的是,所有final类中的方法都隐式的final,他们是无法被覆盖或修改的,因此在其中的方法显示指明为final就显得有些多此一举了。

Static Final用法的更多相关文章

  1. static、final、static final 用法

    1.使用范围:类.方法.变量.2.区别和联系:2.1.static 含义:静态的,被 static 修饰的方法和属性只属于类不属于类的任何对象.2.2.static 用法:2.2.1.static 可 ...

  2. static,final的用法

    static的用法:修鉓符,修鉓属性,方法,代码块a1.修鉓属性:该属性是一个静态的属性,叫类的成员(没有static修鉓的属性叫实例的成员,调用时用:对象名.属性),调用:类名.属性.a2.修鉓方法 ...

  3. Java中static、final用法小结

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  4. Java中static、final用法

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  5. Java中static、final用法小结(转)

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  6. java面试官:兄弟简单谈谈Static、final、Static final各种用法吧

    前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...

  7. java中的Static、final、Static final各种用法详解

    前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...

  8. Java中static的用法

    static静态,作为修饰符,最初是由c引入,一开始static表示退出一个块后依然存在的局部变量.随后,static表示不能被其他文件访问的全局变量和函数.到了C++和java,static表示属于 ...

  9. static、final、static final的区别

    final: final可以修饰属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期初 ...

随机推荐

  1. Notepad++如何安装并使用source code pro 字体 转

      http://blog.yucanlin.cn/2015/04/08/linux-%E5%AE%89%E8%A3%85-source-code-pro-%E5%AD%97%E4%BD%93/ ht ...

  2. curl post参数,接口接收不到数据问题

    今天遇到一个问题,注册下发短信失败,总提示无法发送注册短信,请从新发送. 经检查,curl里面将post数据以json_encode的方法转码之后传递,而且各选项设置感觉没有问题,怎么接口就接收不到p ...

  3. UIPickView的简单介绍

    UIPickView的简单介绍 设置UIPickView的时候,我们主要需要设置一下下面的两个属性 UIPickerView *pickView1; pickView1 = [[UIPickerVie ...

  4. myeclipse一些技巧

    ctrl+h-----------------查找字符串 ctrl+A 全选→ctrl+shift+f 代码格式化,排版 ctrl+shift+O  自动引用

  5. [转] What is the point of redux when using react?

    As I am sure you have heard a bunch of times, by now, React is the V in MVC. I think you can think o ...

  6. MySQL(10):实体、实体表和外键(foreign key)

    1.实体        数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表.视图.存储过程等都是数据库实体.广义上讲,这些对象中所存储的数据也是数据库实体.因为它们也是确切存 ...

  7. iOS 数据持久化(3):Core Data

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  8. 10.30 afternoon

    P76竞赛时间: ????年??月??日??:??-??:?? 题目名称 他 她 它 名称 he she it 输入 he.in she.in it.in 输出 he.out she.out it.o ...

  9. ASP.NET MVC 第四回 向View传值

    一.ViewData与TempData属性来向View页传递对象 上文中已经提到,使用ViewData可以将数据由Controller传递到View 在前文中我们建立了EiceController类  ...

  10. Getting Started with Testing ——开始单元测试

    Android tests are based on JUnit, and you can run them either as local unit tests on the JVM or as i ...