重新学习一下Java中的几个关键字(final/static/volatile......)

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()并无区别。


2、static关键字

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,我们可以在它的任何对象创建之前,直接通过类名来访问访问,无需引用任何对象。

静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法,因为实例成员与特定的对象关联。

static代码块也叫静态代码块,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。利用静态代码块可以对一些static变量进行赋值。


3、this关键字

   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)。

      线程在每次使用变量的时候,都会读取变量修改后的最新值。

详细分析在一篇转载的文章中。

java中关键字volatile的作用

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();  

 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值