Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.1-4.3.3)

来源:互联网 发布:任我行管家婆软件 编辑:程序博客网 时间:2024/04/29 03:56

4.3.1变量命名有哪些规则

在Java语言中,变量名、函数名、数组名统称为标识符,Java语言规定标识符只能由字母(a~z,A~z)、数字(0~9)、下划线(_)和线.此外,标识符也不能包含空白字符(换行符、空格和制表符)。
以下标识符都是非法的:
char:char是Java语言中的一个数据类型,是保留字,不能作为标识符,其他如int、float等与之类似
number of bank:标识符不能有空白字符
a*b: *不能作为标识符的字符
值得注意的是,Java中,变量名是区分大小写的,例如Count和count被认为是两个不同的标识符,而不是相同的。

4.3.2break、continue以及return有什么区别

break用于直接强行跳出当前循环,不再执行剩余代码。当循环中遇到break语句时,忽略循环体中任何其他语句和循环条件测试,程序控制在循环体后面的语句重新开始。所以,当多层嵌套循环,并且break语句出现在嵌套循环中的内层循环时,它将只仅仅终止了内层循环的执行,而不影响外层循环的执行。
continue用于停止当次循环,回到循环起始处,进入下一次循环操作。continue语句之后的语句将不再执行,用于跳过循环体中的一部分语句,也就是不执行这部分语句,而不是跳出整个循环执行循环之外的下一条语句,这就是continue和break的主要区别。简单来说,continue只是中断一次循环的执行而已。
return语句只是一个跳转语句,用来表示一个方法返回(返回一个值或其他复杂类型),可以使程序控制返回到调用该方法的地方。当执行main方法时,return语句可以使程序执行返回到Java运行系统。
break只能跳出当前的循环,那么如何才能跳出多重循环呢?可以在多重循环外面定义一个标识,然后在循环体里使用带有标识的break语句,这样即可跳出多重循环,示例如下:

public class Test {    public static void main(String[] args)    {        //设置标签退出多重循环        out:        for(int i=0;i<5;i++)        {            for(int j=0;j<5;j++)            {                if(j >= 2)                    break out;                System.out.println("j = "+j);            }            System.out.println("i = "+i);        }        System.out.println("break out");    }}

运行结果:
j = 0
j = 1
break out

根据运行结果可以看出来,当内部循环执行到j=2时,程序直接跳出双重循环,执行双重循环外的打印语句。
引申:Java语言中是否存在关键字goto?
虽然关键字goto作为java的保留字,但目前并没有在Java中使用。保留下来的其中一个原因就是这个关键字有可能在将来被使用。
在上例中,使用了标识符加冒号的形式定义标签,如”out:”,用来在多重循环中方便使用break和continue。

4.3.3final、finally和finalize有什么区别

**1>final**final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能在派生出新的子类)。
final属性:被final修饰的变量不可变。由于不可变有两重含义:一是引用不可变;而是对象不可变。那么final到底指的是哪种含义呢?看如下两个实例,实例1:

public class TestFinal {    public static void main(String[] args)    {        final StringBuffer s = new StringBuffer("Hello");        s.append(" World");        System.out.println(s);    }}

运行结果:
Hello World
实例2:

public class TestFinal {    public static void main(String[] args)    {        final StringBuffer s = new StringBuffer("Hello");        s = new StringBuffer("Hello World");    }}

运行结果:编译期间错误
从上面两个实例可以看出,final指的是引用的不可变性,即它只能指向初始时指向的那个对象,而不关心指向对象内容的变化。所以,被final修饰的变量必须被初始化,一般可以通过以下几种方式对其进行初始化:1)在定义时初始化。2)final成员变量可以在初始化块中初始化,但不可以在静态初始化块中初始化。3)静态final成员变量可以在静态初始化块中初始化,但不可以在初始化块中初始化。4)在类的构造器中初始化,但静态final成员变量不可以在构造函数中初始化。
final方法:当一个方法声明为final时,该方法不允许任何子类重写这个方法,但是子类仍然可以使用这个方法。另外,还有一种称为inline(内嵌)的机制,当调用一个被声明为final的方法时,直接将方法体插入到调用处,而不是进行方法调用,这样做能提高程序的效率。
final参数:用来表示这个参数在这个函数内部不允许被修改。
final类:当一个类被声明为final时,此类不能被继承,所有方法都不能被重写。但是这并不代表final类的成员变量也是不可改变的,要想做到final类的成员变量不可改变,必须给成员变量加final修饰。值得注意的是,一个类既不能被声明为abstract,又被声明为final。
2>finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句一定被执行,经常被用在需要释放资源的情况下。
实例3:不使用finally的代码如下所示:

Connection conn;Statement stmt;try{    conn = DriveManager.getConnection(url,userName,password);    stmt = conn.createStatement();    stmt.executeUpdate(update); //执行一条update语句,此时出现异常    stmt.close();    conn.close();    }catch(Exception e){    }

在上面的程序片段中,如果程序在运行过程中没有发生异常,那么数据库的连接能够得到释放,程序运行没有问题。如果在执行update语句时出现异常,后面的close()方法将不会被调用,数据库的连接将得不到释放。如果这样的程序长期运行,将会耗尽数据库的连接资源。通过使用finally可以保证任何情况下数据库的连接资源都能够被释放。
示例4:使用finally的代码如下所示

Connection conn = null;Statement stmt = null;try{    conn = DriveManager.getConnection(url,userName,password);    stmt = conn.createStatement();    stmt.executeUpdate(update);  //执行一条update语句,此时出现异常    stmt.close();    conn.close();    }catch(Exception e) finally{        if(stmt != null)            stmt.close();        if(conn != null)            conn.close();    }

在实例4中,不管程序运行是否会出现异常,finally中的代码一定会执行,这样能够保证在任何情况下数据库的连接资源都能被释放。
3>finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等。需要注意的是,一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

扩展:JDK中一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在JDK中,String,StringBuffer等都是基本类型,所以,String、StringBuffer等类是不能继承的。

阅读全文
0 0