面试问题(一)
所有东西都不是一蹴而就的,我们往往要不断向别人学习,才能更好走出自己的道路。
我大概想要整理一个有关面试遇到的问题的系列,这些问题往往是真实提问过的,所以后续问题可能出现重复的情况,我也不做删除,毕竟出现越多,越说明面试官重视。
一、Java的特点
在听到这个问题的时候,我第一时间想到的就是面向对象,但是对其他的印象就不深了,现在系统整理一下。
平台无关性:Java的“编写一次,运行无处不在”。Java编译器将源代码编译成字节码(bytecode),该字节码可以在任何安装了Java虚拟机(JVM)的系统上运行。
面向对象:Java是一门严格的面向对象编程语言,几乎一切都是对象。面向对象编程(OOP)特性使得代码更易于维护和重用,包括类(class)、对象(object)、继承(inheritance)、多态(polymorphism)、抽象(abstraction)、封装(encapsulation)。
内存管理:Java有自己的垃圾回收机制,自动管理内存和回收不再使用的对象。这样,开发者不需要手动管理内存,从而减少内存泄漏和其他内存相关的问题。
1.封装:
就是把事物封装成类,将类的某些信息隐藏在类内部
,不允许外部程序直接访问,而是通过该类提供的方法
来实现对隐藏信息的操作和访问。
作用:尽可能地隐藏对象的内部实现细节、控制用户对类的修改和访问权限(体现:private属性) 提高代码的可维护性
2.继承:
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力,也就是说子类继承父类
注意:Java只支持单继承 ,一个子类只能继承一个父类,不能继承多个父类 但是可以多重继承
3.多态:
1.父类的引用执行子类的对象
2.编译看左运行看右。
3.一定要有继承和重写
既然他提问你java的特点了,那么你就要多和他掰扯掰扯这些东西。
二、重写重载
这应该是面试官提问了java的特点,说到了继承的内容,所以第二次提问的时候,说了这个问题,不过重写、重载是相当简单的问题了,大家应该都没问题。
重写(Override):
- 发生在子类中,子类对父类中已存在的方法进行重新定义。
- 目的是修改或扩展父类方法的行为。
- 重写的方法必须与父类中被重写的方法有相同的方法签名(方法名、参数类型、参数数量等),并且方法返回类型通常需要一致(在Java中,返回类型可以是协变类型)。
- 重写通常用于实现多态。
重载(Overload):
- 发生在同一个类中,方法名相同,但参数列表不同(参数个数或类型不同)。
- 重载的目的是提高方法的灵活性,让一个方法处理不同类型的输入。
- 重载与返回类型无关,重载仅通过参数的数量、类型或顺序来区分。
重写是子类对父类方法的重新实现,重写是针对方法行为的修改。
重载是同一个类中方法名相同,但参数不同,用于提高方法的灵活性。
三、jvm是什么
JVM是java虚拟机,主要工作是解释自己的指令集(即字节码)并映射到本地的CPU指令集和OS的系统调用。
JVM屏蔽了与操作系统平台相关的信息,使得java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够“一次编译,到处运行”的原因。
四、内存溢出和内存泄漏的理解
内存泄漏:内存泄漏是程序在运行过程中不再使用的对象仍然被引用,而无法被垃圾收集器回收,从而导致可用内存逐渐减少。虽然在Java中,垃圾回收机制会自动回收不再使用的对象,但如果有对象仍被不再使用的引用持有,垃圾收集器无法回收这些内存,最终可能导致程序的内存使用不断增加。
内存泄漏的常见原因:
静态集合:使用静态数据结构(如HashMap或ArrayList)存储对象,且未清理。
事件监听:未取消对事件源的监听,导致对象持续被引用。
线程:未停止的线程可能持有对象引用,无法被回收。
内存溢出:内存溢出是指Java虚拟机(JVM)在申请内存时,无法找到足够的内存,最终引发OutOfMemoryError。这通常发生在堆内存不足以存放新创建的对象时。
内存溢出
大量对象创建:程序中不断创建大量对象,超出JVM堆的限制。
持久引用:大型数据结构(如缓存、集合等)长时间持有对象引用,导致内存累积。
递归调用:深度递归导致栈溢出