java常考面试题

1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

答:Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如 处理器、堆栈 、寄存器等,还具有相应的指令系统。 
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码字节码),就可以在多种平台上不加修改地运行。


2. JDK和JRE的区别是什么?

答:Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。


3. ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

答: “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。static还可以用于修饰内部类(静态内部类),还可以用在import中,可以直接使用某个类的静态属性而不需要类名。 
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。


4. 是否可以在static环境中访问非static变量?

答:static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。


5. 从继承的角度看,将构造函数声明为私有会有何作用?

答:将构造函数声明为私有(private),可以确保类以外的地方都不能直接实例化这个类。在这种情况下,要创建这个类的实例,唯一的办法是提供一个公共静态方法,就像工厂方法模式那样。 
此外,由于构造函数是私有的,因此这个类也不能被继承。


6. 在Java中,若在try-catch-finally的try语句块中插入return语句,finally语句块是否会执行?

*答:会执行。当退出try语句块时,finally语句块将执行。即使我们试图从try语句块里跳出(通过return语句、continue语句、break语句或任意异常语句),finally语句块仍将得以执行。 
*

注意:有些情况下finally语句块将不会执行,比如:

  • 如果虚拟机在try/catch语句块执行期间退出;
  • 如果执行try/catch语句块的线程被杀死终止了。

7. final、finally、finalize之间有何差异?

答:非常笼统的讲,final用于控制变量、方法或类是否“可更改”;finally关键字用在try/catch语句块中,以确保一段代码一定会执行。一旦垃圾收集器确定没有任何引用指向某个对象,就会在销毁这个对象之前调用finalize()方法。下面是关于几个关键字和方法的更多细节: 
① final 
上下文不同,final有不同的含义。

  • 应用于基本类型(primitive)变量时:该变量的值无法更改。
  • 应用于引用(reference)变量时:该引用变量不能指向堆上的其他任何对象。
  • 应用于方法时:该方法不允许重写。
  • 应用于类时:该类不能派生子类。

② finally 
在try块或者catch块之后,可以选择加一个finally语句块,finally语句块里的语句一定会被执行(除非java虚拟机在执行try语句块时退出)。我们会在finally语句块这里编写资源回收和清理的代码。

③finalize() 
当垃圾收集器确定再无任何引用指向某个对象实例时,就会在销毁对象之前调用finalize()方法,一般用于资源清理或者关闭文件。


8. C++模板和java泛型之间有何不同?

答:java泛型实现根植于“类型消除”这一概念。当源代码被转换为Java虚拟机字节码时,这种技术会消除参数化类型。有了Java泛型,我们可以做的事情也并没有真正改变多少;他只是让代码变得漂亮些。鉴于此,Java泛型有时也被称为“语法糖”。 
这和 C++模板截然不同。在 C++中,模板本质上就是一套宏指令集,只是换了个名头,编译器会针对每种类型创建一份模板代码的副本。 
由于架构设计上的差异,Java泛型和C++模板有很多不同点:

  • C++模板可以使用int等基本数据类型。Java则不行,必须转而使用Integer。
  • 在Java中,可以将模板的参数类型限定为某种特定类型。
  • 在C++中,类型参数可以实例化,但java不支持。
  • 在Java中,类型参数不能用于静态方法(?)和变量,因为它们会被不同类型参数指定的实例共享。在C++,这些类时不同的,因此类型参数可以用于静态方法和静态变量。
  • 在Java中,不管类型参数是什么,所有的实例变量都是同一类型。类型参数会在运行时被抹去。在C++中,类型参数不同,实例变量也不同。

9. Java的对象反射是什么?它有什么用?

答:对象反射是Java的一项特性,提供了获取Java类和对象的反射信息的方法,可以执行以下方法:

  • 运行时获得类的方法和字段的相关信息。
  • 创建某个类的新实例。
  • 通过取得字段引用直接获取和设置对象字段,不管访问修饰为何。

反射的作用:

  • 有助于观察和操纵应用程序的运行时行为。
  • 有助于调试或测试程序,因为我们可以直接访问方法、构造函数和成员字段。
  • 即使事前那个不知道某个方法,我们也可以通过名字调用该方法。

10. 线程和进程的区别?

*答:线程和进程有关联,但是两者有着根本上的不同。 
进程可以看作是程序执行时的实例,是一个分配了系统资源的独立实体。每个进程都在各自独立的地址空间执行,一个进程无法访问另一个进程的变量和数据结构。如果一个进程想要访问其他进程的资源,就必须使用进程间通信机制,包括管道、文件、套接字以及其他形式。 
线程存在于进程中,共享进程的资源(包括它的对空间)。同一进程里的多个线程将共享同一个堆空间。这跟进程大不相同,一个进程不能直接访问另一个进程的内存。每个线程仍然会有自己的寄存器和栈,而其他线程可以读写堆内存。


11. 判断对错。在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。

答:错误。 
java多态有两种情况:重载和覆写 
在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法; 
在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法


12. 为什么内部类调用的外部变量必须是final修饰的?

答:因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。 
为了解决:局部变量的生命周期与局部内部类的对象的生命周期的不一致性问题


13. Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

答:当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。 
Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。 
Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。


14. Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

答:Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值