根据使用环境不一样,final的含义会有细微的区别,但一般是指没法改变的内容。final关键字能够修饰变量、方法和类。 this
final数据是用来向编译器告知变量是恒定不变的。对使用基本类型数据的常量,在定义时必须对其赋值。一个既是static又是final的域只会占据一段不能改变的存储空间。当对象使用引用而不是基本类型时使用final修饰,final使引用恒定不变,但其引用的内容可变。 spa
空白的final容许的,但在使用前必须初始化,一旦初始化,将不能再更改。通常应用于类中,在定义处或构造方法中初始化。方法的参数也能够被final修饰,final参数不能更改参数引用指定的对象,主要用来向匿名内部类传递数据。 设计
接口中定义的域不能是空白final的,由于接口中的域都是static final,因此必须在定义时进行初始化。其余位置的static final也同样。 对象
final方法的使用缘由有两个: 继承
类中全部私有方法都隐式的指定为final的,虽然能够给私有方法加final修饰,但不会有任何意义。 接口
final类表示该类没法被继承。final类中的域可根据选择是否成为final域,但类中的方法都将隐式的指定为final的,对每一个方法添加final再也不必要。 内存
static关键字能够修饰变量和方法,主要用于通知编译器将目标设定为静态惟一的。 编译器
static变量经常使用于类中的域。不论类产生了多少对象,static域在内存中只有一份,因此static域也被称为类变量。任何方法均可以直接访问static域。与static变量相对应的非static变量被成为实例变量。static变量通常经过“类名.变量名”的方法进行访问,而不用this,由于其不从属于任何实例。 编译
static变量与final变量不能混为一谈,static变量在内存中惟一,可是是可修改的;final变量在内存中不惟一,但不可修改。 效率
static方法与static变量很类似。static方法在内存中也仅有一份,放置在类的内存里,经过类调用,而不是实例。因此也称为类方法。static方法能够访问static变量,但不能访问实例变量。通常在进行代码设计时,static方法不该访问类中的域及须要实例化的方法,而是应该专一于提供过服务。
通常状况下是不容许定义静态类的,只有在定义内部类的时候才能够加上static关键字,将内部类变为静态类。
内部类是定义在类内部的类,对于Java来讲,内部类很日常。在外部类的非静态方法之外的任意位置建立内部类的对象只须要用直接new OuterClass.InnerClass()便可。但在外部环境中内部类对象是不能直接建立的,须要用OuterClassObject.new InnerClass()的形式来建立。但在外部环境用实例化静态内部类时,则能够直接用new OuterClass.InnerClass()来建立,但此时,静态内部类不能与其外部类发生任何联系,此时的内部类应该称为嵌套类。关于内部类,将在从此的博文中详细说明。