java基础-关键字使用
概述:
高级以上工程师面试,对java关键字的面试其实很少碰到,但是确实还是有的。面试这方面问题是一些比较有流程的公司常见,每一种问题都要问一问。而不会去问你类型关键字啥的,而是问一些实际开发中不太常用的关键字了,因为毕竟是高工就应该“面面俱到”,而实际上的我这种业务驱动的开发人员,没用过记得确实不深刻。
java总共51+2个关键字,大多数关键字都是平时开发经常用到的。就不在多说。如果回答不上来确实不应该。会说一说不经常用的,或者被问到过一些关键字的问题。
按照分类关键字如下:
1、JAVA的保留关键字(2个): const、goto
2、访问修饰符的关键字(3个): public、protected、private
3、定义类、接口、抽象类和实现接口、继承类的关键字、实例化对象(6个):class 、interface 、abstract、implemenst 、extends、new
4、包的关键字(2个): import 、package
5、数据类型的关键字(12个): byte 、char、short、int、float、long、double、void 、boolean、true、false、null
6、条件循环(流程控制)(12个):if、else、while、for、switch、case、default、do、break、continue、return、instanceof
7、修饰方法、类、属性和变量(9个):static、final、super、this、native、strictfp、synchronized、transient、volatile
8、错误处理(5个):try、catch、finally、throw、throws
9、其他(2个):enum、assert
以上的关键字中,加粗的会详细介绍也是面试中经常碰到的。其他的大多数平时写程序都会经常用到。只不过类似import 、package、class 、interface 、abstract、implemenst 、extends、enum这些我们很少手敲,都是IDE的功劳,但是另一方面就是既然IDE几乎完全可以做的事,那就是简单的事。几乎没有啥技术含量,所以没关注到也没啥问题,到了高级攻城狮了,如果面试官在这些关键字问题上能问出什么花来欢迎联系我让我见识见识,如果他问的是:package关键字是做什么用的,那估计你就可以忽悠他了。
下面说说常被问到的关键字
static
修饰内容:成员变量、方法、代码块和内部类、import
作用:静态变量、静态方法就是可以不用实例化类而直接被访问或者调用。静态代码块是对象初始化时被调用的代码块。静态内部类就是为了把内部类升级成为顶级类(反正正常的时候我是没用过,不如直接写一个顶级类了)。静态引入就是引入的类的静态方法可以直接调用而不用写静态类名称而调用,比如Math.abs方法可以直接abs()这样调用,极少用到,代码不易读,而且也容易导致命名空间混淆。
原理:静态成员变量存储在jvm的方法区,并且是类加载完成后就已经存在,不管这个类实例化多少个对象静态成员都是共享的。
常见面试问题:
1.static都可以修饰什么?主要看能不能说出来修饰import,这个很少见,我也只有一次被问到这个。
2.静态成员变量一定是一个jvm只有一个么?不一定,这个是跟类加载器有关的,不同类加载器加载上来的class肯定也不算是同一个类对象,所以代码是同一份,但是却有两个class对象也就有两个静态成员变量了。这个扩展就是两个问题,a.单例中使用static修饰instance的对象肯定是单例么?b.tomcat启动后是几个jvm,若是1个jvm那下面部署的多个项目的静态成员是否共享。这都是类加载器是static修饰的成员变量的边界问题。
native
修饰内容:方法
作用:jni调用,该方法调用本地的c程序方法,用来实现更高效或者java本身无法实现的方法。很少用到,但是阅读jdk源码会看到大量的native方法,比如unsafe类中,就是大量这种方法,由于大多数是直接操作内存的,所以不安全建议个人非必要不使用,知道原理就好。
synchronized
修饰内容:方法、代码块
作用:方法代码块或固定代码块的同步,即同一时刻只有一个从持有该锁的线程能够执行代码块。修饰普通方法就相当于在方法内部加了一个this对象的同步块,修饰静态方法就相当于在方法内部加了一个这个Class的同步块。
常见面试问题:
1.synchronized的实现原理和锁升级,在java基础-jvm内存模型和运行原理一节已经讲述过了。
2.synchronized与Lock的区别,在java基础-jvm内存模型和运行原理一节已经讲述过了。
volatile
修饰内容:成员变量
作用:保证成员变量的内存可见性。
原理:两个作用保证变量在多线程环境的原子性(但是不绝对保证)。1.有任何地方修改了该变量,都要通知缓存了该变量的地方该变量值失效需要从内存中获取。2.用内存屏障来禁止指令重排。
常见面试问题:
1.volatile的原理
2.为什么volatile仍然无法保证原子性。
3.单例模式双重校验锁为什么要添加volatile。
default
常用的是switch子句最后的默认项。
但是查看String实现源码的时候看到个有意思的东西,java1.8之后default可以作为权限修饰符类似public/private的使用,它的权限是本包内可用;另外它修饰的接口方法可以定义一个方法的实现,这就改变了接口不能有方法实现的规则。但是这样做确实不常用也不太好用,因为子类可以实现多个接口,而多个接口中若有冲突的默认方法定义就会报错的。
参考资料
java常用关键字

浙公网安备 33010602011771号