Java经典面试题汇总(二)基础

本篇总结的是Java基础相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢~

目录

1. 什么是Java

2. JVM、JDK和JRE的关系

3. 什么是跨平台性?原理是什么

4. 面向对象的三个特征

5. 接口和抽象类有什么区别?

6. 父类的静态方法能否被子类重写?

7. 面向对象和面向过程的区别

8. 普通类和抽象类有哪些区别?

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

10. 抽象类能使用 final 修饰吗?

11. Java中有哪些数据类型

12. String 属于基础的数据类型吗?

13. String、StringBuffer、StringBuilder和StringJoiner的区别?

14. == 和 equals 的区别是什么?

15. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

16. final 在 Java 中有什么作用?

17. 什么是不可变对象?好处是什么?

18. 引用拷贝和对象拷贝的区别?

19. 值传递和引用传递有什么区别

20. Java 到底是值传递还是引用传递?

21. Java 创建对象的几种方式

22. 什么是反射机制?

23. 重载和重写的区别

24. 成员变量和局部变量的区别

25. Java有哪些访问修饰符?

26. Java 中 IO 流分为几种?

27. BIO、NIO、AIO 有什么区别?

28. &和&&的区别

29. final finally finalize区别


1. 什么是Java

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点  。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 。


2. JVM、JDK和JRE的关系

JVM:Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。
JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac, 还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了, 如果你需要编写 Java 程序,需要安装 JDK。


3. 什么是跨平台性?原理是什么

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。


4. 面向对象的三个特征

封装,继承,多态;有时候也会加上抽象。

Java面向对象编程之三大特性


5. 接口和抽象类有什么区别?

  • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

6. 父类的静态方法能否被子类重写?

不能,父类的静态方法能够被子类继承,但是不能够被子类重写,即使子类中的静态方法与父类中的静态方法完全一样,也是两个完全不同的方法。


7. 面向对象和面向过程的区别

面向对象:面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能、行为 面向对象:将功能封装进对象,强调具备了功能的对象 面向对象是基于面向过程的

面向过程例子: 把大象放进冰箱里分为以下步骤:把冰箱门打开;把大象放进去;关上冰箱门(强调过程和过程中所涉及的行为(强调行为、动作、过程))。

用面向对象思想考虑:无论是打开冰箱,放进大象,关闭冰箱,所有操作都是操作冰箱这个对象,所以只需要将所有功能都定义在冰箱这个对象上,冰箱上就有打开、存储、关闭得所有功能 。 由上可知,面向对象是一种思想,能让复杂问题简单化,程序员不需要了解具体的实现过程,只需要指挥对象去实现功能。 例,面试官面试面试者就是面向对象的体现,面试官需要找具有编程功能的对象(面试者), 而我就是一个具有编程功能的对象,面试完后,让面试者去编程,面试者就去实现编程功能。

8. 普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类是不能被实例化的,就是不能用new调出构造方法创建对象,普通类可以直接实例化。
如果一个类继承于抽象类,则该子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。


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

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

构造函数:抽象类可以有构造函数;接口不能有。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符


10. 抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类


11. Java中有哪些数据类型

  • 基本数据类型(八种)
    • 数值型
      • 整数类型(byte,short,int,long)
      • 浮点类型(float,double)
    • 字符型(char)
    • 布尔型(boolean)
  • 引用数据类型
    • 类(class)
    • 接口(interface)
    • 数组([])

Java中的基本数据类型和引用数据类型的区别


12. String 属于基础的数据类型吗?

String 不是基本的数据类型,是 final 修饰的 Java 类,是引用类型。


13. String、StringBuffer、StringBuilder和StringJoiner的区别?

String声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer。
StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾,它的底层是通过StringBuilder实现的
在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。


14. == 和 equals 的区别是什么?

== 是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写。

基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;
代码示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

15. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对,两个对象的 hashCode() 相同,equals() 不一定 true。


String str1 = "通话";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d",  str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));

执行的结果:
str1:1179395 | str2:1179395
false

代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,
因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

16. final 在 Java 中有什么作用?

  • final 修饰的类叫最终类,该类不能被继承。
  • final 修饰的方法不能被重写。
  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

17. 什么是不可变对象?好处是什么?

不可变对象指对象一旦被创建,状态就不能再改变,任何修改都会创建一个新的对象,如 String、Integer及其它包装类.不可变对象最大的好处是线程安全。

深入理解Java中的不可变对象


18. 引用拷贝和对象拷贝的区别?

引用拷贝:他并没有重新建立一个对象,而是新对象和旧对象同时指向同一个地址。
这就会出现当修改了旧对象里的属性值,copy对象的属性值同样会被修改。

对象拷贝:对象拷贝分为浅拷贝和深拷贝

Java深入理解深拷贝和浅拷贝区别


19. 值传递和引用传递有什么区别

值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。

引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。


20. Java 到底是值传递还是引用传递?

值传递!!!传送门


21. Java 创建对象的几种方式

  • new创建新对象
  • 通过反射机制
  • 采用clone机制
  • 通过序列化机制

22. 什么是反射机制?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射机制优缺点

  • 优点: 运行期类型的判断,动态加载类,提高代码灵活度。
  • 缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。

23. 重载和重写的区别

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载; 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问, 不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。


24. 成员变量和局部变量的区别

成员变量:
          1、成员变量定义在类中,在整个类中都可以被访问。
          2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
          3、成员变量有默认初始化值。
局部变量: 
          1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
          2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
          3、局部变量没有默认初始化值 


25. Java有哪些访问修饰符?

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

public : 对所有类可见。使用对象:类、接口、变量、方法

修饰符当前类同包子类其他包
public
protected×
default××
private×××

26. Java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。 字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。


27. BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。


28. &和&&的区别

相同点:&和&&都可以用作逻辑与的运算符,表示逻辑与(and)。

不同点:

  • &&具有短路的功能,而&不具备短路功能。
  • 当&运算符两边的表达式的结果都为true时,整个运算结果才为true。而&&运算符第一个表达式为false时,则结果为false,不再计算第二个表达式。
  • &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如:0x31 & 0x0f的结果为0x01。

29. final finally finalize区别

  • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表 
    示该变量是一个常量不能被重新赋值。
  • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块 
    中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
  • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调 
    用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的 
    最后判断。

评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让程序飞

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值