1、 final关键字
final关键字可以修饰类,方法和变量,对于每一种修饰都有不同的意义,但目的是相同的,保持完整性防止改变。
例如,在Java中final类不可以被继承,final变量的值不可以修改,final方法不可以被重载。
在Java中,我们无法让对象被修饰为final,而只能修饰对象的引用,这意味着即使你写public final A a = new A(); 事实上a指向的对象的数据依然可以被修改,不能修改的是a本身的引用值,即你不能再对a进行重赋值。同样的情况出现在数组中,比如public final int[] a = {1, 2, 3, 4, 5},事实上a中的数值是可修改的,即可以写a[0] = 3。据目前了解,java中数组内的数据是无法修饰为不可修改的,而C/C++可以。
当一个方法被修饰为final方法时,意味着编译器可能将该方法用内联(inline)方式载入,所谓内联方式,是指编译器不用像平常调用函数那样的方式来调用方法,而是直接将方法内的代码通过一定的修改后copy到原代码中(将方法主体直接插入到调用处,而不是进行方法调用)。这样可以让代码执行的更快(因为省略了调用函数的开销),比如在int[] arr = new int[3]调用arr.length()等。
另一方面,私有方法也被编译器隐式修饰为final,这意味着private final void f()和private void f()并无区别。
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,我们可以在它的任何对象创建之前,直接通过类名来访问访问,无需引用任何对象。
静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法,因为实例成员与特定的对象关联。
static代码块也叫静态代码块,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。利用静态代码块可以对一些static变量进行赋值。
this关键字是指当前对象的,具体用法有以下几种:
(1)引用成员变量
如果在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,而不是指成 员方法的形式参数或者局部变量。
如构造函数常用的this.name=name;
(2)调用类的构造方法
public class Student{
public Student(){
this(“luobo”)
}
public Student(String name){
this.name=name;
}
}
上面代码中this("luobo")就是调用第二个构造方法。
(3)返回对象的值
如在 代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。
public class Test {
public Test(){
Object o=getValue();
System.out.println(o.toString());
}
public Object getValue(){
return this;
}
public static void main(String[] args) {
new Test();
}
}
输出:Test@8e3cf25
4、volatile关键字
用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B)放进线程自己的内存空间里,线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)。
线程在每次使用变量的时候,都会读取变量修改后的最新值。
详细分析在一篇转载的文章中。
http://blog.csdn.net/csummm4/article/details/21026743
5、transient关键字
transient说明一个属性是临时的,不会被序列化。
6、super关键字
通常来讲表示一个父类的引用。
但是以前碰到过一道Java的面试题:
import java.util.Date;
public class Test extends Date
{
public void test()
{
System.out.println(super.getClass().getName());
}
public static void main(String[] args)
{
new Test().test();
}
}
输出结果不是Date,而是Test
因为super并没有代表超类的一个引用的能力,只是代表调用父类的方法而已。所以,在子类的方法中,不能这样用System.out.println(super);也不能使用super.super.mathod();
事实上,super.getClass()是表示调用父类的方法。getClass方法来自Object类,它返回对象在运行时的类型。因为在运行时的对象类型是Test,所以this.getClass()和super.getClass()都是返回Test。
为了得到Date改为:
getClass().getSuperClass().getName();