【2021最新版】JavaOOP面试题总结(99道题含答案解析)

363 阅读8分钟

前言

最近面试的小伙伴很多,对此我整理了一份Java面试题手册:基础知识、JavaOOP、Java集合/泛型面试题、Java异常面试题、Java中的IO与NIO面试题、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、SpringBoot、SpringCloud、RabbitMQ、Dubbo、MyBatis、ZooKeeper、数据结构、算法、Elasticsearch、Kafka、微服务、Linux等等。 可以分享给大家学习。【持续更新中】

完整版Java面试题地址:【2021最新版】Java面试真题汇总

1、什么是B/S架构?什么是C/S架构

2、Java都有那些开发平台?

3、什么是JDK?什么是JRE?

答:

  1. JDK:java development kit:java开发工具包,是开发人员所需要安装的环境
  2. JRE:java runtime environment:java运行环境,java程序运行所需要安装的环境

4、Java语言有哪些特点

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

6、什么是数据结构?

7、Java的数据结构有那些?

8、什么是OOP?

9、类与对象的关系?

10、Java中有几种数据类型

11、标识符的命名规则。

12、instanceof关键字的作用

**答:**instanceof严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:

boolean result = obj instanceof Class

其中obj为一个对象,Class表示一个类或者一个接口,当obj为Class的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result都返回true,否则返回false。

注意:编译器会检查obj是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。

inti=0; 
System.out.println(i instanceof Integer);//编译不通过i必须是引用类型,不能是基本类型 
System.out.println(i instanceof Object);//编译不通过
 Integer integer=newInteger(1); 
 System.out.println(integer instanceof Integer);//true 
 //false,在JavaSE规范中对instanceof运算符的规定就是:如果obj为null,那么将返回false。 System.out.println(nullinstanceofObject);

13、什么是隐式转换,什么是显式转换

14、Char类型能不能转成int类型?能不能转化成string类型,能不能转成double类型

15、什么是拆装箱?

答:

  1. 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer);调用方法:Integer的valueOf(int) 方法拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)。
  2. 调用方法:Integer的intValue方法在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:
Integer i = new Integer(10);

而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:

Integer i = 10;

面试题1: 以下代码会输出什么?

public class Main { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1==i2); System.out.println(i3==i4); } }

结果:

true false

16、Java中的包装类都是那些?

17、一个java类中包含那些内容?

18、那针对浮点型数据运算出现的误差的问题,你怎么解决?

19、面向对象的特征有哪些方面?

20、访问修饰符 public,private,protected,以及不写(默认) 时的区别?

答: 类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公 开(public),对于不是同一个包中的其他类相当于私有(private)。受保护 (protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私 有。 Java 中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的 修饰符可以是以上四种。

21、String 是最基本的数据类型吗?

22、flfloat f=3.4;是否正确?

23、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1; 有错吗?

24、重载和重写的区别

25、equals与==的区别

26、++i与i++的区别

27、程序的结构有那些?

28、数组实例化有几种方式?

29、Java中各种数据默认值

30、Java常用包有那些?

31、Object类常用方法有那些?

32、java中有没有指针?

33、java中是值传递引用传递?

34、实例化数组后,能不能改变数组长度呢?

35、假设数组内有5个元素,如果对数组进行反序,该如何做?

36、形参与实参区别?

37、构造方法能不能显式调用?

38、什么是方法重载?

答: 静态实例化:创建数组的时候已经指定数组中的元素。

int [] a= new int[]{ 1 , 3 , 3}

动态实例化:实例化数组的时候,只指定了数组程度,数组中所有元素都是数组类型的默认值

39、构造方法能不能重写?能不能重载?

40、内部类与静态内部类的区别?

41、Static关键字有什么作用?

42、fifinal在java中的作用,有哪些用法?

答:

final也是很多面试喜欢问的地方,但我觉得这个问题很无聊,通常能回答下以下5点就不错了:

  1. 被fifinal修饰的类不可以被继承。
  2. 被fifinal修饰的方法不可以被重写。
  3. 被fifinal修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.。
  4. 被fifinal修饰的方法,JVM会尝试将其内联,以提高运行效率。
  5. 被fifinal修饰的常量,在编译阶段会存入常量池中。

除此之外,编译器对fifinal域要遵守的两个重排序规则更好: 在构造函数内对一个fifinal域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含fifinal域的对象的引用,与随后初次读这个fifinal域,这两个操作之间不能重排序。

43、StringString StringBuffffffffer 和 StringBuilder 的区别是什么?

44、String str=”aaa”,与String str=new String(“aaa”)一样吗?

45、讲下java中的math类有那些常用方法?

46、String类的常用方法有那些?

答:

charAt:返回指定索引处的字符

indexOf():返回指定字符的索引

replace():字符串替换

trim():去除字符串两端空白

split():分割字符串,返回一个分割后的字符串数组

getBytes():返回字符串的byte类型数组

length():返回字符串长度

toLowerCase():将字符串转成小写字母

toUpperCase():将字符串转成大写字符

substring():截取字符串

format():格式化字符串

equals():字符串比较

47、Java中的继承是单继承还是多继承?

48、Super与this表示什么?

49、普通类与抽象类有什么区别?

50、什么是接口?为什么需要接口?

51、接口有什么特点?

52、抽象类和接口的区别?

53、Hashcode的作用?

54、 Java的四种引用,强弱软虚?

答:

强引用

强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式:

String str = new String("str");

软引用

软引用在程序内存不足时,会被回收,使用方式:

// 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,
 // 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T
  SoftReference<String> wrf = new SoftReference<String>(new String("str"));

可用场景:创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建的对象。

弱引用

弱引用就是只要JVM垃圾回收器发现了它,就会将之回收,使用方式:

WeakReference<String>wrf=newWeakReference<String>(str);

可用场景:Java源码中的java.util.WeakHashMap中的key就是使用弱引用,我的理解就是,一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。

虚引用

虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入ReferenceQueue中。注意哦,其它引用是被JVM回收后才被传入ReferenceQueue中的。由于这个机制,所以虚引用大多被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有ReferenceQueue,使用

例子:

PhantomReference<String>prf=newPhantomReference<String>(new String("str"),newReferenceQueue<>());

可用场景: 对象销毁前的一些操作,比如说资源释放等。** Object.finalize() 虽然也可以做这类动作,但是这个方式即不安全又低效上诉所说的几类引用,都是指对象本身的引用,而不是指 Reference 的四个子类的引用( SoftReference 等)。

55、Java创建对象有几种方式?

56、有没有可能两个不相等的对象有相同的hashcode

57、拷贝和浅拷贝的区别是什么?

58、static都有哪些用法?

59、a=a+b与a+=b有什么区别吗?

60、fifinal、fifinalize()、fifinally

61、JDBC操作的步骤

62、在使用jdbc的时候,如何防止出现sql注入的问题。

63、怎么在JDBC内调用一个存储过程?

64、是否了解连接池,使用连接池有什么好处?

65、你所了解的数据源技术有那些?使用数据源有什么好处?

66、&和&&的区别?

67、静态内部类如何定义?

68、什么是成员内部类?

答:

定义在类内部的非静态类,就是成员内部类。成员内部类不能定义静态方法和变量(final修饰的除外)。这是因为成员内部类是非静态的,类初始化的时候先初始化静态成员,如果允许成员内部类定义静态变量,那么成员内部类的静态变量初始化顺序是有歧义的。实例:

public class Out { 
private static int a; 
private int b; 
public class Inner { 
public void print() { System.out.println(a);
 System.out.println(b); } } }

69、Static Nested Class和Inner Class的不同?

70、什么时候用assert?

71、Java有没有goto?

72、数组有没有length()这个方法? String有没有length()这个方法?

73、用最有效率的方法算出2乘以8等於几?

74、flfloat型flfloat f=3.4是否正确?

75、排序都有哪几种方法?请列举。

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

77、说出一些常用的类,包,接口,请各举5个。

78、a.hashCode() 有什么用?与a.equals(b) 有什么关系?

79、Java中的编译期常量是什么?使用它又什么风险?

80、在Java中,如何跳出当前的多重嵌套循环?

81、构造器(constructor)是否可被重写(override)?

82、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

83、是否可以继承 String类?

84、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

85、String和StringBuilder、StringBuffffer的区别?

86、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

87、char 型变量中能不能存贮一个中文汉字,为什么?

88、抽象类(abstract class)和接口(interface)有什么异同?

89、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

答:

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示:
* 扑克类(一副扑克) * @author 骆昊 */public class Poker { private static String[] suites = {"黑桃", "红桃", "草花", "方块"}; private static int[] faces = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; private Card[] cards; /** * 构造器 * */ public Poker() { cards = new Card[52]; for(int i = 0; i < suites.length; i++) { for(int j = 0; j < faces.length; j++) { cards[i * 13 + j] = new Card(suites[i], faces[j]); } }
* }/** * 洗牌 (随机乱序) * */ public void shuffle() { for(int i = 0, len = cards.length; i < len; i++) { int index = (int) (Math.random() * len); Card temp = cards[index]; cards[index] = cards[i]; cards[i] = temp; } }/** * 发牌 * @param index 发牌的位置 * */ public Card deal(int index) { return cards[index]; }/** * 卡片类(一张扑克) * [内部类] * @author 骆昊 * */ public class Card { private String suite; // 花色 private int face; // 点数 public Card(String suite, int face) { this.suite = suite; this.face = face; }@Override public String toString() { String faceStr = ""; switch(face) { case 1: faceStr = "A"; break; case 11: faceStr = "J"; break; case 12: faceStr = "Q"; break; case 13: faceStr = "K"; break; default: faceStr = String.valueOf(face); } return suite + faceStr; } } }//测试类 class PokerTest { public static void main(String[] args) { Poker poker = new Poker(); poker.shuffle(); // 洗牌 Poker.Card c1 = poker.deal(0); // 发第一张牌 // 对于非静态内部类 Card // 只有通过其外部类 Poker 对象才能创建 Card 对象 Poker.Card c2 = poker.new Card("红心", 1); // 自己创建一张牌 System.out.println(c1); // 洗牌后的第一张 System.out.println(c2); // 打印: 红心 A } }

90、Java中会存在内存泄漏吗,请简单描述。

91、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

92、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

93、如何实现对象克隆?

94、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类?

是否可继承具体类(concreteclass)?

95、一个”java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

96、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

97、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

98、Java中的fifinal关键字有哪些用法?

最后

该面试题答案解析完整文档获取方式:JavaOOP面试题总结

我这边还整理了一份Java的系统化资料:(包括Java核心知识点、面试专题和21年最新的互联网真题、电子书等)有需要的朋友可以关注公众号【程序媛小琬】即可获取。