Java教程

精尽Java面试题(基础)

本文主要是介绍精尽Java面试题(基础),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、什么是面向对象

面向对象(Object Oriented Programming)是一种思想,世间万物都可以看成一个对象。Java是一个支持并发、基于类和面向对象的计算机编程语言。

特点:模块化开发易维护,复用性强,代码可靠灵活,可读性高

四大特征:

封装:隐藏内部特性和行为,提供对外访问接口

        private 私有,只有本类可以访问

        default 默认,同包        protected 同包或者不同包的子类  public 所有都可以访问

继承:给对象提供从基类获取字段和方法的能力,重写

多态:不同底层实现相同接口展示的能力

抽象:把一类功能类似的类抽象出来一个抽象类,用作继承的基类

2、面向对象和面向过程的区别

面向过程优点性能相对较高,系统开销大耗资源。缺点不易维护复用和拓展。

面向对象优点易维护,易复用和拓展,可以设计低耦合系统灵活已维护。缺点性能较低。

3、重写重载区别

重写方法名、参数、返回值类型相同;基于父类与子类之间的;子类不能缩小父类访问权限、不能抛比父类大的异常;

final修饰的方法不能重写;重载存在于父类和子类、同类中;参数不同、返回值类型相同;

4、JDK、JRE、JVM区别

JDK是java开发工具包,包括JRE和编译、运行等开发工具;

JRE是Java运行环境,包括jvm和丰富的类库

JVM是虚拟机,提供字节码文件.class文件运行环境的支持。

5、Jdk8新特性

Lambda 表达式

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。https://blog.csdn.net/qq_36154832/article/details/103575601

Stream

Stream 是Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。https://blog.csdn.net/qq_36154832/article/details/103582459

接口添加默认方法

Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 default 关键字修饰。https://blog.csdn.net/qq_36154832/article/details/103615702

方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。https://blog.csdn.net/qq_36154832/article/details/103580430

新的时间API

Optional类

6、什么是字节码,使用字节码好处是什么

字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。字节码是直接面向虚拟机的解释的代码,每一个平台解释器是不同的,但是实现的虚拟机是相同的。

在一定程度上解决了传统解释型语言效率低的问题,有保留了解释型语言可移植的特点。

使JVM成为一个跨语言的平台,虚拟机不关心字节码是由什么编写的,任何语言只要能编译成字节码文件都可以在虚拟机上运行,比如Scala、Jython、JRuby。Java平台多语言混合编程成为主流,通过特定领域的语言去解决特定问题。

7、Java中基本数据类型、引用数据类型

基本数据类型

数值byte、short、int 、long 占用字节数分别是 1、2、4、8

字符型char     2

浮点型float、double   4、8

布尔型boolean     1

引用数据类型在栈中只存储一个地址,地址指向堆中。

类、接口、数组、

值传递和引用传递

基本数据类型的“=”是值传递,传递的是该变量的副本,修改不会改变原变量

引用传递是对应引用类型的数据来说,传递的是引用地址,修改变量会改变变量本身(String除外)

8、SrtringBuffer和StringBuilder、String的区别

SrtringBuffer和StringBuilder、String都是用来存储字符串的类型

String是字符串,不可改变。

SrtringBuffer和StringBuilder是可以改变的,SrtringBuffer是线程安全的,使用Synchronized,StringBuilder效率更高一点。

https://blog.csdn.net/qq_36154832/article/details/118674500

9、什么是自动拆装箱

基本数据类型和引用类型直接的转换,JDK5以后引入的自动拆装箱机制,目的就是简化代码。

Integer total = 99; 
//执行上面那句代码的时候,系统为我们执行了: 
Integer total = Integer.valueOf(99);

int totalprim = total; 
//执行上面那句代码的时候,系统为我们执行了: 
int totalprim = total.intValue();

10、int和Integer区别

int基本数据类型 Integer是包装类

JDK5引入一种新特性来节省内存开销。整型对象在内部实现中通过相同的引用来实现缓存和重用(范围-127~128)仅在自动装箱时有用,构造器不适用。

包装对象的数值比较,不能简单的使用==,虽然-128到127之间的数字可以,但是这个范围之外还是需要使用equals比较。
前面提到,有些场景会进行自动拆装箱,同时也说过,由于自动拆箱,如果包装类对象为null,那么自动拆箱时就有可能抛出NPE。
如果一个for循环中有大量拆装箱操作,会浪费很多资源。

11、==与 equals 区别

基本数据类型都是比较相等性的,引用类型判断对象是否是同一个

12、hashCode()和equals(a)方法

https://blog.csdn.net/qq_36154832/article/details/118676338

有没有可能2个不相等的对象有相同的hashCode

有可能,这个叫做哈希碰撞。

总结

equals不相等,hashcode可能相等,这个叫做hash碰撞

equals相等,必须重写hashcode方法,保证hashcode方法相等

13、final修饰符关键字,修饰类表明不能派生新的子类,修饰方法表明这个方法不能被重写,修饰变量表示该表明必须初始化,并且不能被修改

finally在异常处理时提供finally来执行清除操作,比如关闭流

finally不会执行的四种情况:
finally出现异常;
使用System.exit()退出程序;
程序所在线程死亡;
关闭CPU

finalize是方法名,java允许使用finalize()方法在垃圾收集器将对象重内存中清除之前进行必要的清理操作。finalize方法是Object方法,子类通过重写来实现清理系统资源和其他操作。

String可以被继承吗,不可,final修饰的。

14、抽象类和接口区别

简单的来说,抽象是对类的抽象,是一种模板设计,接口是一种行为的抽象,是一种行为规范。

15、类实例化顺序

父类静态变量

父类静态代码块

子类静态变量

子类静态代码块

父类非静态变量(成员变量)

父类构造函数

子类非静态变量(成员变量)

子类构造函数

16、什么是内部类

简单的说就是在一个类、接口或者方法内部创建一个类。

内部类提供了更好的封装,除了外围类,其他的类都不能访问。

Java内部类总结

https://www.cnblogs.com/happyone/p/11306419.html

17、什么是IO

I/O即输入/输出(Input/Output),java IO相关类在java.io包下

 18、序列化

https://blog.csdn.net/qq_36154832/article/details/95636063

如果一个字段不想被序列化可以使用transient关键字来修饰

19、如何实现对象克隆

一般来说有两种方式:
1、使用cloneable接口,并重写Object类中的clone()方法,可以实现浅克隆

2、实现Serializable即可,并通过序列化和反序列化实现克隆,可以实现深克隆

实际应用中克隆用的比较少,项目中最多使用属性克隆 BeanUtils工具类.

20、error和exception区别

Java异常体系

 Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),他是异常处理机制的基本组成类型。
Exception和Error体现了java平台设计者对不同异常情况的分类,Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。
Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常状态,不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源码里必须显示的进行捕获处理,这里是编译期检查的一部分。前面我们介绍的不可查的Error,是Throwable不是Exception。
不检查异常就是所谓的运行时异常,类似NullPointerException,ArrayIndexOutOfBoundsExceptin之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。

finally代码模块通常用于释放资源,如IO缓冲区,数据库连接等等。

异常被处理后对象会被GC回收

21、反射的用途和实现

java反射机制主要提供以下功能

在运行时构造一个类

判断一个类所具有的成员变量和方法

调用一个方法

生成动态代理

应用很多,例如Spring框架的IOC基于反射创建对象和设置一样属性

SpringMVC的请求调用对应的方法也是通过反射

jdbc的Class#forName(String classname)方法,也是使用反射

22、反射中class.forName 和 classLoader区别

class.forName除了会将类的class文件加载到jvm中,还会对类进行解释,执行类中的static块

classLoader只会加载class文件,只有在newInstance才会执行static代码块

23、UnsupportOperationException异常

表明操作不支持的异常,在集合框架中大量应用

24、什么是注解、断言

25、创建对象的方式

new关键字

Class类的newInstance方法(反射)

Constructor中的newInstance方法(反射)

clone对象

反序列化机制创建的对象

这篇关于精尽Java面试题(基础)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!