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

相关文章
|
2天前
|
存储 算法 Java
Java面试之SpringCloud篇
Java面试之SpringCloud篇
14 1
|
2天前
|
SQL 关系型数据库 MySQL
java面试之MySQL数据库篇
java面试之MySQL数据库篇
6 0
java面试之MySQL数据库篇
|
2天前
|
存储 缓存 前端开发
Java八股文面试之多线程篇
Java八股文面试之多线程篇
11 0
Java八股文面试之多线程篇
|
8天前
|
缓存 Java 数据库连接
java面试题目 强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
【6月更文挑战第28天】在 Java 中,理解和正确使用各种引用类型(强引用、软引用、弱引用、幻象引用)对有效的内存管理和垃圾回收至关重要。下面我们详细解读这些引用类型的区别及其具体使用场景。
17 3
|
2天前
|
存储 Java Linux
Java面试之Linux和docker
Java面试之Linux和docker
10 0
|
2天前
|
缓存 NoSQL Java
Java面试之分布式篇
Java面试之分布式篇
8 0
|
2天前
|
消息中间件 负载均衡 Java
JAVA面试之MQ
JAVA面试之MQ
11 0
|
2天前
|
Java
java面试之线程八锁
java面试之线程八锁
7 0
|
2天前
|
缓存 NoSQL Redis
Java面试之redis篇
Java面试之redis篇
10 0
|
2天前
|
Java 调度 Windows
Java面试之程序、进程、线程、管程和并发、并行的概念
Java面试之程序、进程、线程、管程和并发、并行的概念
8 0