Java基础——关键字

参考Java程序员面试笔试宝典:

目录

1.变量命名规则

2.break,continue,return有什么区别

3.final、finally、finalize有什么区别

4.assert有什么作用

5.static关键字有哪些作用

6.使用switch有哪些注意事项

7.volatile有什么作用

8.instanceof有什么作用

9.strictfp有什么作用


1.变量命名规则

变量名、函数名、数组名称统称为标识符。

标识符只能由字母(a~z,A~Z)、数字(0-9),下划线(_)和$组成,标识符第一个字符必须是字母、下划线或$,标识符不能包含空白字符(换行符、空格、制表符)

2.break,continue,return有什么区别

1)break直接跳出当前循环,不再执行剩余代码,终止内层循环的执行,不影响外层循环的执行

2)continue停止当次循环,回到循环起始处,进入下一次循环操作。简而言之就是中断一次循环的执行。

3)return是个跳转语句,表示从一个方法返回。执行main方法时,使程序执行返回到java运行系统。

break用于跳出多重循环:

public class Break {
    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);
            }
        }
        System.out.println("break");
    }
}

结果:

0

1

break

引申:java中不存在goto关键字,作为保留字,防止开发人员用goto作为变量名来使用。

3.final、finally、finalize有什么区别

1)final声明属性,表示属性不可变;声明方法,表示方法不可覆盖;声明类,表示类不可被继承

不可变由两重含义,引用不可变和对象不可变,final指的使引用不可变,即它只能指向初始化时指向的哪个对象,不关心指向对象的内容变化。因此,final修饰的变量必须初始化。

当一个方法声明为final时,该方法不允许任何子类重写,但仍可以使用该方法。

当一个类被声明为final时,此类不能被继承,所有方法不能重写,但成员变量可改变,若想不可改变,必须给成员变量增加final修饰。一个类不能既声明为abstract,又声明为final

2)finally作为异常处理的一部分,只能用在try/catch语句中,且附带一个语句块,表示这段语句最终一定被执行,经常用在需要释放资源的情况。

3)finalize时Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件。注意:一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

问:JDK中哪些类不能被继承?

答:用final关键字修饰的类。一般比较基本的类型为防止扩展类无意间破坏原来方法的实现的类型都应该是final的,例如JDK中的String、StringBuffer等类不能被继承。

拓展:看String类的源码是用final修饰的,这样设计有什么好处?

Java语言之父曾有过回答,大体是它能够缓存结果,当你在传参时不需要考虑谁会修改它的值;若是可变类,则可能需要重新拷贝一个新值来传参,在性能上有一定损失。而另一个原因就是安全,当你在调用其他方法时,如系统级操作指令之前,可能有一系列校验,若是可变类,在你校验过后,它的内部值又被改变了,这样可能引起严重的系统崩溃问题,这也是迫使String类设计成不可变类的一个重要原因。使用final还有一个好处,就是高效,以字符串常量池举例。只有字符串不变时,才能实现字符串常量池,它可以为我们缓冲字符串,提高程序运行效率。试想String可变,两个变量s1和s2指向同一字符串,s1的值修改后,s2的值也跟着改变,和预期结果不相符,无法实现字符串常量池功能了。

4.assert有什么作用

断言(assert),一种软件调试方法,一种在代码中进行正确性检查的机制。主要作用是对一个boolean表达式进行检查,正确运行为true,错误为false。实际开发中,assert主要用来保证程序正确性,通常在开发和测试时使用。软件发布后,assert检查默认关闭。

assert应用范围:1)检查控制流;2)检查输入参数是否有效;3)检查函数结果是否有效;4)检查程序不变量

5.static关键字有哪些作用

主要两个作用:

1)为某些特定数据类型或对象分配单一的存储空间,与创建对象的个数无关。

2)实现某个属性或方法与类关联在一起,而不是与对象,可以在不创建对象的情况下通过类直接调用方法或使用类的属性。

static有4种使用情况:成员变量、成员方法、代码块和内部类。

1)static成员变量:

Java没有全局的概念,但可以通过static关键字达到全局的效果。静态变量属于类,内存中只有一个复制(所有实例均指向同一内存地址),只要静态变量所在类被加载,静态变量就会被分配空间。注意在java中不能在方法体中定义static变量

2)static成员方法:

是类的方法,不需要创建对象就可以被调用。非static方法是对象的方法,只有对象创建出来后才可以被使用。

static方法不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法。因为当static方法被调用时,这个类的对象还没被创建,同理static方法也不能访问非static类型的变量。

static一个重要用途就是实现单例模式。单例模式特点为该类只能有一个实例,则必须隐藏类的构造函数,即构造函数为private,并提供一个创建对象的方法,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象。

public class Singleton {
    private static Singleton instance=null;
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}

3)static代码块

static代码块在类中独立于成员变量和成员函数,不在任何一个方法体内,JVM在加载类时会执行static代码块,如果有多个static代码块,则按顺序执行。static代码块常被用来初始化静态变量,且只会被执行一次。

4)static内部类

static内部类可以不依赖于外部类实例对象而被实例化,不能与外部类有相同名字,不能访问外部类的普通成员变量,只能访问外部类的静态成员和静态方法,包括私有类型。

引申:

1.什么是实例变量、局部变量、类变量、final变量?

实例变量:变量归对象所有——只有在实例化对象后才能使用

局部变量:在方法中定义的变量,在使用前必须初始化

类变量:用static可修饰的属性、变量归类所有,只要类被加载,就可使用(类型.变量名)。所有实例化的对象共享类变量。

final变量:常量,不可修改

2.static与final结合使用表示什么意思?

对于变量,用static final修饰,则不可修改,可直接通过类名访问。

对于方法,用static final修饰,则不可覆盖,可直接通过类名访问。

6.使用switch有哪些注意事项

用于多分支选择,switch(expr),expr只能是一个枚举常量,内部由整型或字符类型实现或一个整数表达式。与switch对应的是case语句,之后可以是直接的常量数值,也可以是一个常量计算式,也可final型变量,但不能是变量或带变量的表达式。

从java 7开始,switch支持String类型,但本质还是int类型值的匹配。对String对象调用hasCode()方法,得到一个int类型的hash值,用这个hash值唯一标识这个case

一般case语句结尾添加break语句。

7.volatile有什么作用

volatile是一个类型修饰符,用来修饰被不同线程访问和修改的变量。被volatile类型定义的变量,系统每次用到它时直接从对应的内存中提取,而不会利用缓存。在使用了volatile修饰成员变量后,所有线程在任何时候所看到变量的值都是相同的。

public class MyThread implements Runnable{
    private volatile Boolean flag;
    public void stop(){
        flag=false;
    }
    public void run(){
        while(flag)
            ;  //do something
    }
}

以上常用来停止线程,若flag没有声明为volatile,则当run方法判断时,可能取的是缓存中的值,导致无法获取其他线程对flag的操作,线程无法及时停止。

注意:volatile不能保证操作的原子性,会阻止编译器对代码的优化,降低执行效率。除非迫不得已,能不使用volatile则不使用。

8.instanceof有什么作用

一个二元运算符,作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例,返回boolean类型数据。

常用用法:result=object instanceof class,若object是class的一个实例则true,不是则false

9.strictfp有什么作用

strict float point,指的是精确浮点,确保浮点数运算的准确性。

strictfp声明一个类、接口或方法,在声明的范围内,java编译器以及运行环境会完全依照IEEE二进制浮点数算数标准(IEEE 754)执行,所有浮点数计算都是精确的,在不同的硬件平台上会有一致的运行结果。

public strictfp class Test{
    public static void testStrictfp(){
        float f=0.123456f;
        double d=0.03498788d;
        double sum=f+d;
        System.out.println(sum);
    }
    public static void main(String[] args) {
        testStrictfp();
    }
}

结果:

0.15844388128173828

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值