Java面试基础篇
一:Java的概述
1.什么是Java语言?
Java语言是世界上最吊的语言,是面向对象的编程语言,不仅吸收了c++语言的各种优点,还摒弃了c++语言中令人难以理解的多继承和指针等概念。Java语言具有功能强大和简单易用的两大特点。Java语言作为静态的面向对象的编程语言,很好的实现了面向对象的理论,允许程序员以优雅的思维方式进行复杂的编程。
2.Java语言有哪些特点?
面向对象:(封装、继承、多态)
平台无关性:Java语言‘一次编译,到处运行’,采用java语言有很好的移植性
支持多线程:支持多线程(参考线程知识)
编译与解释并存:编译:java语言(.javac命令)编译虚拟机可以识别成字节码(.class)文件。解释:将字节码文件通过(.java命令翻译成计算机机器可以识别的机器码)
3.什么是JVM、JDK和JRE,他们的区别?
JVM:(java virtural machine)java虚拟机,java程序运行在虚拟机之上,可以针对不同的系统(Windows,Linux,macOS)实现不同的JVM,从而达到一次编译,到处运行的特点。
JRE:(java runtime environment)java运行时环境。运行已编译java程序所需的所有内容的集合。包括JVM。不能用来创建新程序。
JDK:(java development kit)java开发工具包。它拥有JRE的一切,他是功能齐全的Java SDK。能够创建和编译程序

4.Java的跨平台性?
所谓的java的跨平台性就是一次编译到处运行的特点。
原理:java又JVM虚拟机,java程序是通过Java虚拟机在系统平台上运行的,只要该系通装有虚拟机,该系统就可以运行Java程序。
5.什么是字节码文件?采用字节码文件的好处?
字节码文件就是Java语言经过编译生成的.class文件,字节码文件可以被虚拟机识别,从而实现Java程序的跨平台性。
6:为什么说Java语言编译与解释并存?
因为Java程序要经过先编译后解释的两个步骤,有Java编写的程序需要先经过编译步骤,生成对性的(.class)字节码文件,然后经过虚拟机解释成计算机系统可以识别的机器语言才能运行。因此,我们认为Java语言编译和解释并存。
二:基础语法
1.Java有哪些数据类型:
基本数据类型:整型:byte short int long (long的数据类型必须加L或l)
浮点型:float (单精度) (float类型必须加上F或f) double(双精度)
布尔型:boolean (true和false)
字符型:char
引用数据类型:类,接口,数组,
2.switch可以作用在哪些数据类型之上?
在Java5之前,switch(expr)中的expr可以是byte short int char
在Java5后,Java引入了枚举类型enum(后面扩充),expr可以是enum类型的。
在Java7之后,expr还可以是字符串String类型的,但是long在所有版本中都是不被允许的。
3.自动类型转换、强制类型转换?
Java中的所有数据类型都可以进行转换,当把一个表示范围小的数据类型想要转换到表示范围大的数据类型时,自已进行自动的类型转换,反之就需要强制类型转换。(就像有个大水杯,有个小水杯,小的往大的里面倒水,大的绝对可以装下,然而大的向小水杯里面倒水时,就可能会洒出来。)
4.访问修饰符的差别?
Java中的访问修饰符支持4中不同的类型。
default:(默认的类型,什么不写就默认是default)在同一包内可见。使用对象:类,接口,变量,方法。
private:仅在同一类中可见,使用对象(变量(属性)、方法),注意不java应届基础能修饰类(外部类) (封装的使用)
protected:对同一包内的的类和子类可见。使用对象:变量、方法。注意不能修饰类(外部类)
public:对所有类都可见,使用对象:类,接口,变量,方法。
大小:public>protected>default>private
5.什么是自动拆装箱?
Java可以自动对基本数据类型和他们之间的包装类进行装箱拆箱
6.&和&& |和||
& :与 && 短路与 |:或 || 短路或
&& 与& 都是与的意思,但是&&是短路与,当左边的结果为false时,就发生短路,右边也就不再执行。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
7.break、continue、return的区别及作用?
break:打破当前循环,结束循环,跳出循环,不再执行。
continue:跳出本次循环,进行下一次循环。(结束正在执行的循环条件,进入到下一个循环条件)
return:程序返回,后面的代码都不再进行,(结束当前的方法,直接返回)
8.说说自增,自减运算?
++ 和 – 可以放在变量之前,也可以放在变量之后。
9.final、finally、finalize的区别?
final: final 修饰变量:变量变为常量,不可以改变,(其中不可变分为引用不可变和对象不可变,final指的是引用不可变),因为不可 变,final修饰的变量必须初始化。
final 修饰方法 :方法不允许被任何子类重写,但子类可以使用该方法。
final 修饰类:被修饰的类不可以被继承,类中的所有方法都不能被重写。
finally:作为处理异常处理的一部分,只能在try/catch语句中,并且附带一个语句块表示这段语句最终一定会被执行(无论是否抛出异常),(经常用于释放资源) System.exit(0)可以阻断finally的执行
finalize:是在java.lang.Object里面定义的方法,因为是Object类,也就是说每一个对象都有这么一个方法,该方法在 gc 启动,该对象被回收的时候被调用。(一个对象的 finalize 方法只会被调用一次,finalize 被调用不一定会立即回收该对象,所以有可能调用 finalize 后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会再次调用 finalize 了,进而产生问题,因此不推荐使用 finalize 方法。)
10. static 关键字?
通常在new创建一个对象的时候,才会分配数据存储空间,方法才供外界调用。用上static就会单独分配一个存储空间,可以不用创建对象就可以使用方法,在静态区域里面。
static关键字,表示一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时绑定,而static方法是编译时静态绑定的,static方法跟类的任何实例都不相关。
10.1 是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它所有的实例中的值都是一样的,当类被Java虚拟机载入的时候,会对static变量进行初始化,如果你的代码尝试不用实例来访问非static的变量,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
10.2 static静态方法里面可不可以引用静态资源?
可以,因为都是类在初始化的时候加载的,大家都一样,互相认识。
10.3 非静态方法里面能不能引用静态资源?
可以,非静态方法就是实例方法,那是new之后才产生的,那么属于类的内容它都认识。
10.4 java静态变量、代码块、和静态方法的执行顺序是什么?
基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块
代码块执行顺序静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器
想要深入了解,可以参考这篇文章 :[https://juejin.cn/post/(opens new window)](
三:面向对象
1.面向对象和面向过程的区别?
面向过程:就是分析解决问题所需的步骤,然后用函数把这些步骤一一实现,使用的时候再一个个的依次调用。
面向对象:把构成问题的事务分解为各个对象,而建立对象的目的也不是为了完成一个步骤,而是为了描述某个事件在解决整个问题的过程所发生的行为。 目的是为了写出通用的代码,加强代码的重用,屏蔽差异性。
例子:面向过程就是编年体 面向对象就是纪传体
2.面向对象的三大特性:
封装、继承、多态
封装:将数据(属性) 和操作数据的方式捆绑,给属性加上private 修饰,提供对应的set get方法
3.重载和重写的区别?
重载:方法名一样,返回值类型可以一样也可以不一样,参数必须不同,(顺序,数据类型,个数)必须不同。
重写:子类和父类拥有一样的方法(参数相同,返回值类型相同,方法名相同)但是方法体可能不同,方法的重写用于提供父类已经声明的方法的属于自己的特殊实现。是多态形成的基础条件。
4.this关键字有什么用?
简单来说this关键字就是指代当前类对象。(探讨super的区别)
this表示当前方法调用者得地址值。
(注意this关键字不能在静态方法中使用,因为在静态方法中没有隐含的当前对象。静态方法是属于类的,不属于任何具体的对象实例)
5.抽象类(abstract class)和接口(interface)有什么区别?
①接口的方法默认是public,所有方法在接口中都不能有实现(Java8中接口的方法可以有默认实现)而抽象类可以有非抽象的方法。
②接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
③一个类可以实现多个接口,但是只能实现一个抽象类,接口自己本身,可以通过extends关键字扩展多个接口。
④接口方法默认都是public,抽象方法可以有public、protected、和default这些修饰符(抽象方法就是为了被重写,所以不能被private关键字修饰!)
⑤从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
- 在 JDK8 中,接⼝也可以定义静态⽅法,可以直接⽤接⼝名调⽤。实现类和实现是不可以调⽤的。如果同时实现两个接⼝,接⼝中定义了⼀样的默认⽅法,则必须重写,不然会报错。
- jdk9 的接⼝被允许定义私有⽅法 。
总结⼀下 jdk7~jdk9 Java 中接⼝的变化:
- 在 jdk 7 或更早版本中,接⼝⾥⾯只能有常量变量和抽象⽅法。这些接⼝⽅法必须由选择实现接⼝的类实现。
- jdk 8 的时候接⼝可以有默认⽅法和静态⽅法功能。
- jdk 9 在接⼝中引⼊了私有⽅法和私有静态⽅法
6.成员变量与局部变量的区别有哪些?
1.从语法上来看成员变量是属于类的,而局部变量是在方法中定义的变量或者是方法的参数,成员变量可以被public、private、static等修饰符修饰,而局部变量不能被访问修饰符及static所修饰,但是成员变量和局部变量都能被final所修饰。
2.从变量在内存中的存储方式来看:如果成员变量是使⽤ static 修饰的,那么这个成员变量是属于类的,如果没有使⽤ static 修饰,这个成员变量是属于实例的。对象存于堆内存,如果局部变量类型为基本数据类型,那么存储在栈内存,如果为引⽤数据类型,那存放的是指向堆内存对象的引⽤或者是指向常量池中的地址。
3从变量在内存中的⽣存时间上看:成员变量是对象的⼀部分,它随着对象的创建⽽存在,⽽局部变量随着⽅法的调⽤⽽⾃动消失。
4成员变量如果没有被赋初值:则会⾃动以类型的默认值⽽赋值(⼀种情况例外:被 final 修饰的成员变量也必须显式地赋值),⽽局部变量则不会⾃动赋值
7.== 和 equals的区别?
==的作用是判断两个对象的地址值是不是相等。即判断两个对象是不是同一个对象(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)_
equals() :它的作用也是判断两个对象是否相等,但是这个‘相等’分为两种情况:
8.hashCode与equals?
注意:面试官一般常问:(你重写过hashCode和equals()吗?为什么重写equals()方法,必须重写hashCode方法?)
什么是hashCode方法?
hashCode方法的作用就是获取哈希码。他返回一个int 整数,定义在Object类中,是一个本地的方法。
为什么要有hashCode方法?
hashCode方法主要是用来获取对象的哈希码,哈希码是由对象的内存地址或对象的属性计算出来的,他是一个int类型的整数,通常是不会重复的,因此可以用来做键值对的键,以提高查询效率。
为什么重写equals方法时,必须重写hashCode方法?
维护equals和hashCode之间的一致性是至关重要的,因为基于哈希的集合类,依赖于这一点来正确存储和检索对象。
具体地说,这些集合通过对象的哈希码将其存储在不同的“桶”中(底层数据结构是数组,哈希码用来确定下标),当查找对象时,它们使用哈希码确定在哪个桶中搜索,然后通过 方法在桶中找到正确的对象。
如果重写了 方法而没有重写 方法,那么被认为相等的对象可能会有不同的哈希码,从而导致无法在集合中正确处理这些对象
为什么两个对象有相同的 hashcode 值,它们也不⼀定相等?
这主要是由于哈希码(hashCode)的本质和目的所决定的。
哈希码是通过哈希函数将对象中映射成一个整数值,其主要目的是在哈希表中快速定位对象的存储位置。
由于哈希函数将一个较大的输入域映射到一个较小的输出域,不同的输入值(即不同的对象)可能会产生相同的输出值(即相同的哈希码)。
这种情况被称为哈希冲突。当两个不相等的对象发生哈希冲突时,它们会有相同的 hashCode。
为了解决哈希冲突的问题,哈希表在处理键时,不仅会比较键对象的哈希码,还会使用 equals 方法来检查键对象是否真正相等。如果两个对象的哈希码相同,但通过 equals 方法比较结果为 false,那么这两个对象就不被视为相等
9. Java是值传递还是引用传递
Java是值传递,不是引用传递
10.引用类型的变量有什么特点?
引用类型的变量,存储的是对象的地址值,而不是对象本身,因此,引用数据类型的变量在传递时,传递的是对象的地址值,传递的是引用的值。
11.深拷贝和浅拷贝?
因此深拷贝是安全的,浅拷贝的话如果有引用类型,那么拷贝后对象,引用类型变量修改,会影响原对象。
浅拷贝如何实现呢?
Object 类提供的 clone()方法可以非常简单地实现对象的浅拷贝。
深拷贝如何实现呢?
- 重写克隆方法:重写克隆方法,引用类型变量单独克隆,这里可能会涉及多层递归。
- 序列化:可以先将原对象序列化,再反序列化成拷贝对象。
12. Java创建对象的几种方式?
Java中创建对象有以下四种方式:
new创建一个新对象
通过反射机制
采用clone机制
通过序列化机制
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/225.html