Java关键字

Java关键字

在Java中一共有50个关键字,但更为确切的讲,Java中的有效关键字为48个,而goto和const一般被称为保留字(Reserved Word),这两个关键字都没有实际意义,不能在Java中使用。除此之外,Java还提供了3个直接量(Literal),分别是true、false和null。Java的标识符的命名既不能使用上述提供的50个关键字,也不能使用这3个直接量。

记住关键字并不难,可以被这些关键字分门别类地加以归纳,这样只要记住几个大类即可,凡是属于这些类的标识符就是关键字,其余的标识符就不是关键字。可以按照如下方法分类:

  • 包、类、接口定义相关的

    class,interface,package,extends,implements,import,abstract

  • 基本数据类型

    int,float,double,char,long,enum,void,byte,short,boolean

  • Java访问控制符

    if,while,else,for,break,case,continue,default,do,return,switch,synchronized

  • 类型、变量、方法修饰符

    final,native,private,protected,public,static,volatile,strictfp,transient

  • 异常处理相关的

    try,throws,catch,finally

  • 类引用

    this,super

  • 运算符

    new,assert,instanceof

  • 保留字

    goto,const

    按照上述分类方法,很容易就能判断出main不是关键字。虽然main是Java程序的入口方法,但是它只是一个方法名而已,并不是关键字,仍然可以将main作为一般的标识符使用。例如,将main作为变量名使用

简述final、fianally和finalize的区别

final、fianally和finalize的含义及区别

final、finally和finalize是三个看上去很相似的关键字,很容易被混淆,但他们的含义不尽相同

final

final这个关键字可用来修饰类的属性、方法的参数、方法以及类的本身。final修饰属性时表示该属性不可变;final修饰方法时表示该方法不可覆盖;final修饰类时表示该类不可被继承。下面分别进行介绍。

当使用final修饰属性(变量、对象)时,必须对属性(变量,对象)进行初始化。如果final修饰的变量是基本数据类型,则一旦该变量被初始化就不能被赋予新值。

final int a=6;
a=7;//错误,a声明为final,因此不能被赋予新值。

如果final修饰的是一个引用类型的对象,则这里指的不可变是指该引用所引用的地址不能改变,并不表示该引用对象的内容本身不能发生改变。例如:

final String str="Hello";
str=str+"World";//错误,因为str此时要试图指向一个新的字符串

上面这段程序中,字符串str最初执行字符串常量"Hello",接下来试图执行str=str+“World!”;将字符串"Hello"与字符串"World!"进行连接,并用str指向的新的字符串(由于字符串类型是不可变类型,所以str指向的字符串本身内容不能被修改)。但是由于str开始被声明为fianl,所以会发生编译错误。

final StringBuffer str=new StringBuffer("Hello");
str.append("World!");//没有问题,str指向的对象内容可以发生改变

再如上面这段代码,虽然str也被声明为final,但是它指向的对象是StringBuffer类型的对象,其内容可以被修改,所以通过append方法修改StringBuffer里面字符串的内容是可以的。

通过上面两个实例就能更加直观理解当使用final修饰引用型变量时,它只能指向初始时指向的那个对象,而指向对象的内容可以被修改。

当使用final修饰方法的参数时则表示该参数方法内部不能被修改,它有点类似于C++中用const修饰函数的形参。

当使用final修饰方法时,该方法不能被子类覆盖重写,但是该方法在子类中仍然可以被使用。与此同时,在Java中用final修饰的函数也为称为内联函数。这个内联函数类似于C++的内联函数,它并不是必需的,而是编译时告诉编译器这个函数可以函数可以作为内联函数编译。至于最终编译器如何处理则由编译器自己处理。内联函数的优势在于调用函数时,系统会直接将方法插入调用处,从而省去了方法调用的环境,提升了程序的执行效率。

当一个类被final修饰时,该类不能继承,因此该类的所有方法也就不能被覆盖重写。需要注意的是,抽象类(abstract class)和接口(interface)不能用final修饰,因为定义的抽象类和接口就是用来被继承和实现的。

finally

在前面的面试题中已经讲到,finally这个关键字只有在异常处理时才会出现,它通常于try、catch合用,并自带一个语句块。不管try块中的代码是否发生异常,也不管哪一个catch块得到执行,finally块最终是会被执行到,所以finally块中的代码常被用来执行进行资源回收、文件流关闭等操作。

try{
    corsor=mContext.getContentResolver().query(uri,null,null,null,null);
    if(corsor!=null){
        cursor.moveToFirst();
        //do something
    }
}catch(Exception e){
    e.printStatckTrace();
}finally{
    if(cursor!=null){
        cursor.close();
    }
}

上面这段代码是一段Android程序,在try块中通过ContentResolver从ContentProvider中得到数据库中的数据,并将查询结果的记录保存在cursor中,然后通过cursor读取这些数据并进行某些操作。但是ContentResolver的操作可能会抛出异常,因此这里用catch捕获这个异常,如果发生异常则会输出该异常的信息。但是这还是不够的,因为还需要将打开的cursor关闭,否则会导致cursor leak.但是由于ContentResolver操作可能会发生异常,因此为了确保cursor.close();被调用,将这段程序写在finally块中。这样程序无论是否发生异常都会执行cursor.close();从而避免了cursor leak的发生。

finalize

finalize是Object类的一个方法。在垃圾回收机制执行的时候会调用被回收对象的finalize方法。因为finalize是Object类的方法,所以Java中任何类都可以覆盖这个方法,并在该方法中清理该对象所占用的资源。

因为Java中增加了垃圾回收机制,所以省去人们手动释放空间的麻烦,在很大程度上避免了内存泄露的发生。那为什么还要有finalize方法呢?这是因为,有时在撤销一个对象的还需要对一些非Java资源进行处理,Java提供了这种所谓的收尾机制,使用收尾机制可以在一个对象将要被垃圾回收调用到该对象的finalize方法,从而清理一些非Java资源。

在使用finalize时需要特别注意一点,不要认为finalize方法一定会被执行。垃圾回收机制何时调用对象的finalize方法对程序完全是透明的,当系统中资源充足时,垃圾回收机制可能并不能得到执行。因此如果想要保证某一个时刻某个类中打开的资源一定被清理,就不要这个操作放在这个类的finalize方法中执行,因为并不能确定该方法什么时候被执行,是否会被执行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值