Java面试题1:Java基础篇

简介: 面向对象是一种万物皆对象的编程思想,任何物体都可以归为一类事物,而一个个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动的。

1、什么是面向对象?面向对象和面向过程的区别?

答:

面向对象是一种万物皆对象的编程思想,任何物体都可以归为一类事物,而一个个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动的。

区别:

①编程思路不同:面向过程以实现功能的函数开发为主,面向对象是首先抽象出类、属性及其方法,然后通过实例化、执行方法来完成功能。

②封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。

③面向对象有继承性和多态性,而面向过程没有。

—————————————————————————————————

2、面向对象的三大特性?解释?

答:

①封装:把数据和操作数据的方法封装起来,对数据的访问和操作只能通过定义好的接口。

②继承:从已有类得到继承信息创建新类的过程。提供继承信息的类称为父类、超类、基类等,得到继承信息的类被叫做子类、派生类。

③多态:多态分为编译时多态(方法重载)和运行时多态(方法重写)。

这里需要注意以下几点:

(1)重写和重载的区别:

59eb9f5e55d3c04a193c5e8d38076891_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_19,color_FFFFFF,t_70,g_se,x_16.png

(2)⼦类拥有⽗类对象所有的属性和⽅法(包括私有属性和私有⽅法),但是⽗类中的私有属性和⽅法⼦类是⽆法

访问,只是拥有。因为在⼀个⼦类被创建的时候,⾸先会在内存中创建⼀个⽗类对象,然后在⽗类对象外部放上⼦

类独有的属性,两者合起来形成⼀个⼦类的对象; ⼦类可以拥有⾃⼰属性和⽅法; ⼦类可以⽤⾃⼰的

⽅式实现⽗类的⽅法。(重写)

——————————————————————————————————

3、JDK,JRE,JVM三者之间的关系为:

答:

JDK(Java Development Kit):是 Java 开发⼯具包,是整个 Java 的核⼼,包括了 Java 运⾏环境 JRE、Java ⼯具

和 Java 基础类库。

JRE( Java Runtime Environment):是 Java 的运⾏环境,包含 JVM 标准实现及 Java 核⼼类库。

JVM(Java Virtual Machine):是 Java 虚拟机,是整个 Java 实现跨平台的最核⼼的部分,能够运⾏以 Java 语⾔写作的软件程序。所有的 Java 程序会⾸先被编译为 .class 的类⽂件,这种类⽂件可以在虚拟机上执⾏

——————————————————————————————————

4、Java 中是否可以重写⼀个 private 或者 static ⽅法?

答:

Java 中 static ⽅法不能被覆盖,因为⽅法覆盖是基于运⾏时动态绑定的,⽽ static ⽅法是编译时静态绑定的。

static ⽅法跟类的任何实例都不相关,所以概念上不适⽤。

Java 中也不可以覆盖 private 的⽅法,因为 private 修饰的变量和⽅法只能在当前类中使⽤, 如果是其他的类继承当前类是不能访问到 private 变量或⽅法的,当然也不能覆盖。

静态⽅法补充:静态的⽅法可以被继承,但是不能重写。如果⽗类和⼦类中存在同样名称和参数的静态⽅

法,那么该⼦类的⽅法会把原来继承过来的⽗类的⽅法隐藏,⽽不是重写。通俗的讲就是⽗类的⽅法和⼦类的⽅法是两个没有关系的⽅法,具体调⽤哪⼀个⽅法是看是哪个对象的引⽤;这种⽗⼦类⽅法也不在存在多态的性质。

————————————————————————————————————

5、构造器是否可以被重写?

答:

⽗类的私有属性和构造⽅法并不能被继承,所以 Constructor 也就不能被Override(重写),但是可以 Overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。

——————————————————————————————————————

6、构造方法有哪些特性?

答:

(1)名字与类名相同;

(2)没有返回值,但不能⽤ void 声明构造函数;

(3)成类的对象时⾃动执⾏,⽆需调⽤。

——————————————————————————————————————

7、在 Java 中定义⼀个不做事且没有参数的构造⽅法有什么作⽤?

答:

Java 程序在执⾏⼦类的构造⽅法之前,如果没有⽤ super() 来调⽤⽗类特定的构造⽅法,则会调⽤⽗类中“没有参

数的构造⽅法”。

因此,如果⽗类中只定义了有参数的构造⽅法,⽽在⼦类的构造⽅法中⼜没有⽤ super() 来调⽤⽗类中特定的构造

⽅法,则编译时将发⽣错误,因为 Java 程序在⽗类中找不到没有参数的构造⽅法可供执⾏。解决办法是:在⽗类

⾥加上⼀个不做事且没有参数的构造⽅法。

———————————————————————————————————————

8、Java中创建对象的几种方式?

答:

1、使⽤ new 关键字;

2、使⽤ Class 类的 newInstance ⽅法,该⽅法调⽤⽆参的构造器创建对象(反射):

Class.forName.newInstance(); 3、使⽤ clone() ⽅法;

4、反序列化,⽐如调⽤ ObjectInputStream 类的 readObject() ⽅法。

————————————————————————————————————————

9、抽象类和接口有什么区别?

答:

(1)抽象类中可以定义构造函数,接口不能定义构造函数。

(2)抽象类中可以有抽象方法和具体方法,但是接口中只能有抽象方法。

(3)抽象类中的成员权限可以是public、默认、protected(注意抽象类中抽象方法就是为了可以重写,所以不能被private修饰),而接口中的成员只可以是public,方法默认:public abstract、成员变量默认为:public static final)

(4)抽象类中可以包含静态方法,而接口中不可以。

JDK8中有所改变:

JDK1.8中,允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。

抽象类中可以包含静态⽅法,在 JDK1.8 之前接⼝中不能包含静态⽅法,JDK1.8 以后可以包含。之前不能包含

是因为,接⼝不可以实现⽅法,只可以定义⽅法,所以不能使⽤静态⽅法(因为静态⽅法必须实现)。现在可以包

含了,只能直接⽤接⼝调⽤静态⽅法。JDK1.8 仍然不可以包含静态代码块。

——————————————————————————————————————————

10、静态变量和实例变量的区别?

答:

静态变量:是被 static 修饰的变量,也称为类变量,它属于类,因此不管创建多少个对象,静态变量在内存中有且

仅有⼀个拷⻉;静态变量可以实现让多个对象共享内存。

实例变量:属于某⼀实例,需要先创建对象,然后通过对象才能访问到它

——————————————————————————————————————————

11、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?

答:

对于 short s1 = 1; s1 = s1 + 1; 来说,在 s1 + 1 运算时会⾃动提升表达式的类型为 int ,那么将 int 型值赋值给

short 型变量,s1 会出现类型转换错误。

对于 short s1 = 1; s1 += 1; 来说,+= 是 Java 语⾔规定的运算符,Java 编译器会对它进⾏特殊处理,因此可以正确

编译。

——————————————————————————————————————————

12、Integer和int的区别?

(1)int 是 Java 的⼋种基本数据类型之⼀,⽽ Integer 是 Java 为 int 类型提供的封装类;

(2)int 型变量的默认值是 0,Integer 变量的默认值是 null,这⼀点说明 Integer 可以区分出未赋值和值为 0 的

区分;

(3)Integer 变量必须实例化后才可以使⽤,⽽ int 不需要。

详细说说两者之间的对比:

a9ef17ccc36385379243d1a4b6ac576b_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_19,color_FFFFFF,t_70,g_se,x_16.png

—————————————————————————————————————————

13、Object 的常⽤⽅法有哪些?

答:

ae276faf69bbf6b73528218d6f7ad675_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png

——————————————————————————————————————————

14、final、finally、finalize的区别?

答:

final:⽤于声明属性、⽅法和类,分别表示属性不可变、⽅法不可覆盖、被其修饰的类不可继承;

finally:异常处理语句结构的⼀部分,表示总是执⾏;

finallize:Object类的⼀个⽅法,在垃圾回收时会调⽤被回收对象的finalize。

——————————————————————————————————————————

15、==和equals的区别

答:

https://blog.csdn.net/why_youjjww/article/details/106352996?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163093356916780269844589%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163093356916780269844589&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-106352996.first_rank_v2_pc_rank_v29&utm_term=%3D%3D%E5%92%8Cequals%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187

——————————————————————————————————————————

16、两个对象的 hashCode() 相同,则 equals() 也⼀定为 true 吗?

答:

两个对象的 hashCode() 相同,equals() 不⼀定为 true。因为在散列表中,hashCode() 相等即两个键值对的哈希

值相等,然⽽哈希值相等,并不⼀定能得出键值对相等【散列冲突】。

——————————————————————————————————————————

17、为什么重写 equals() 就⼀定要重写 hashCode() ⽅法?

答:

29c6b1e163077a808079f523034a58e9_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_19,color_FFFFFF,t_70,g_se,x_16.png

——————————————————————————————————————————————

18、&和&&的区别?

答:

Java 中 && 和 & 都是表示与的逻辑运算符,都表示逻辑运输符 and,当两边的表达式都为 true 的时候,整个运算

结果才为 true,否则为 false。

&&:有短路功能,当第⼀个表达式的值为 false 的时候,则不再计算第⼆个表达式;

&:不管第⼀个表达式结果是否为 true,第⼆个都会执⾏。除此之外,& 还可以⽤作位运算符:当 & 两边的表达式

不是 Boolean 类型的时候,& 表示按位操作。

——————————————————————————————————————————————

19、Java中的参数传递是传值还是传引用。

答:

Java 的参数是以值传递的形式传⼊⽅法中,⽽不是引⽤传递。

当传递⽅法参数类型为基本数据类型(数字以及布尔值)时,⼀个⽅法是不可能修改⼀个基本数据类型的参数。

当传递⽅法参数类型为引⽤数据类型时,⼀个⽅法将修改⼀个引⽤数据类型的参数所指向对象的值。即使 Java 函

数在传递引⽤数据类型时,也只是拷⻉了引⽤的值罢了,之所以能修改引⽤数据是因为它们同时指向了⼀个对象,

但这仍然是按值调⽤⽽不是引⽤调⽤。

——————————————————————————————————————————————

20、Java中的Math.round(-1.5)等于多少?

答:

等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃

———————————————————————————————————————————————

21、两个⼆进制数的异或结果是什么?

答:

两个⼆进制数异或结果是这两个⼆进制数差的绝对值。表达式如下:a^b = |a-b|。

两个⼆进制 a 与 b 异或,即 a 和 b 两个数按位进⾏运算。如果对应的位相同,则为 0(相当于对应的算术相减),

如果不同即为 1(相当于对应的算术相加)。由于⼆进制每个位只有两种状态,要么是 0,要么是 1,则按位异或

操作可表达为按位相减取值相对值,再按位累加。

————————————————————————————————————————————————

22、深克隆和浅克隆的区别?

答:

329923aa198a48ed080e284c3e6be49b_040917096982413f88b14ec7fd900e67.png

————————————————————————————————————————————————

23、什么是Java的序列化,如何实序列化。

答:

对象序列化是⼀个⽤于将对象状态转换为字节流的过程,可以将其保存到磁盘⽂件中或通过⽹络发送到任何其他程

序。从字节流创建对象的相反的过程称为反序列化。⽽创建的字节流是与平台⽆关的,在⼀个平台上序列化的对象

可以在不同的平台上反序列化。序列化是为了解决在对象流进⾏读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现 Serializable 接⼝,该接⼝没有需要实现的⽅法,只是⽤于标注该对象是

可被序列化的,然后使⽤⼀个输出流(如:FileOutputStream)来构造⼀个 ObjectOutputStream 对象,接着使

⽤ ObjectOutputStream 对象的 writeObject(Object obj) ⽅法可以将参数为 obj 的对象写出,要恢复的话则使⽤

输⼊流。

什么情况下需要序列化?

29b38b0e8f4f229f409a35eeab7d6639_0c51c185aac94326983180c9f5e9c95f.png

相关文章
|
24天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
64 2
|
12天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
36 14
|
23天前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
29天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
17天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
25 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
52 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
88 4
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
25 1