> 文档中心 > Java八股文大厂面试宝典——第一期(Java基础)

Java八股文大厂面试宝典——第一期(Java基础)


当看到这篇文章,那么我们就有一个共同的目标,进大厂,为了大厂梦,冲

Jvva大厂面试第一期:
主要对对Java基础部分进行了总结

题目总汇

  • 1:为什么Java代码可以做到一次编写,到处运行?
  • 2:说一说Java的访问权限?
  • 3:说一下Java的基本数据类型?
  • 4:说一说你对面向对象的理解。
  • 5:说一下面向对象的三大特征?
  • 6:重载和重写的区别?
  • 7:==和equals的区别?
  • 8:请说一说自动拆箱,自动装箱的应用场景。
  • 9: 说一下String,StringBuffer,StringBuilder的区别?
  • 10:接口和抽象类有什么区别?
  • 11:说一下你对面向接口编程的理解。
  • 12:遇到异常,你通常如何处理?
  • 13:说一说hashCode()和equals()的关系。

1:为什么Java代码可以做到一次编写,到处运行?

Jvm是Java跨平台的关键。
在程序运行前。Java源代码需要经过编译器编译成字节码文件,在程序运行时jvm负责将字节码文件编译成特定平台下的机器码并运行,也就是说只要在不同的平台上安装对应的jvm,就可以运行字节码文件。
同一份Java源代码在不同平台上运行,不需要你做任何改变,并且只需要编译一次,而编译好的字节码文件是通过jvm这个中间的桥梁实现跨平台的。
注意:编译生成的是字节码文件,不是机器码
字节码不能直接运行必须通过jvm的翻译才能运行
跨平台的是Java程序,不是jvm。

2:说一说Java的访问权限?

Java语言为我们提供了三种,还有一个是缺省的
Public:改成员可以被任意包下任意类访问
Protected:该类成员可以被同一包下的其他类访问,还可以被他的子类访问
缺省:被同一包下的其他类访问
Private:被该类的内部成员访问

3:说一下Java的基本数据类型?

可分为基本数据类型和引用数据类型
基本数据类型有八个
又可分为四类:整数类型:byte,short,int,long
浮点类型:float,double
字符类型:char
布尔类型:boolean
引用数据类型就是对一个对象的引用,根据引用的对象不同可分为三类
数组类型,类,接口

4:说一说你对面向对象的理解。

面向对象是- -种更优秀的程序设计方法,它的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。它从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物为中心来思考,认识问题,并根据这些事物的本质特点,把它们抽.象地表示为系统中的类,作为系统的基本构成单元,这使得软件系统的组件可以直接映像到客观世界,并保持客观世界中事物及其相互关系的本来面貌。

5:说一下面向对象的三大特征?

面向对象的程序设计方法具有三个基本特征:封装、继承、多态。
其中,封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;
继承是面向对象实现件复用的重要手段,当子类继承父类后,子头作为一种特殊的父类,将直接获得父类的属性和方法;
多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同方法时,可能表现出多种行为特征。
具体内容可见:面向对象三大特征

6:重载和重写的区别?

重载发生在同- -个类中,若多个方法之间方法名相同、参数列表不同,则它们构成重载的关系。重载与方法的返回值以及访问修饰符无关,即重载的方法不能根据返回类型进行区分。
重写发生在父类子类中,若子类方法想要和父类方法构成重写关系,则它的方法名、参数列表必须与父类方法相同。另外,返回值要小于等于父类方法,抛出的异常要小于等于父类方法,访问修饰符则要大于等于父类方法。还有,若父类方法的访问修饰符为private,则子类不能对其重写。
详细描述见 :重载与重写

7:==和equals的区别?

==运算符:
●作用于基本数据类型时,是比较两个数值是否相等;
●作用于引用数据类型时,是比较两个对象的内存地址是否相同,即判断它们是否为同一个对象;

equals()方法:
●没有重写时,Object默认以==来实现,即比较两个对象的内存地址是否相同;
●进行重写后,一般会按照对象的内容来进行比较,若两个对象内容相同则认为对象相等,否则认为对象不等。

8:请说一说自动拆箱,自动装箱的应用场景。

自动装箱、自动拆箱是JDK1.5提供的功能。
自动装箱:可以把一-个基本类型的数据直接赋值给对应的包装类型;
自动拆箱:可以把- -个包装类型的对象直接赋值给对应的基本类型;
通过自动装箱、自动拆箱功能,可以大大简化基本类型变量和包装类对象之间的转换过程。比如,某个方法的参数类型为包装类型,调用时我们所持有的数据却是基本类型的值,则可以不做任何特殊的处理,直接将这个基本类型的值传入给方法即可。

9: 说一下String,StringBuffer,StringBuilder的区别?

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
StringBuffer对象则代表-一个字符序列可变的.字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、
reverse()、setCharAt()、 setL ength()等方法可以改变这个字符串对象的字符序列。-旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为- -个String对象。
StringBuffer、StringBuilder都代表 可变的字符串对象,它们有共同的父类
AbstractStringBuilder,并且两个类的构造方法和成员方法也基本相同。不同的是,
StringBuffer是线程安全的,而StringBuilder是非线程安全的,所以StringBuilder性能略高。一般情况下,要创建一-个内容可变的字符串,,建议优先考虑StringBuilder类。

10:接口和抽象类有什么区别?

从设计目的上来说,二者有如下的区别:
接口体现的是一-种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务;对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。当在一个程序中使用接口时,接口是多个模块间的耦合标准,当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准。
抽象类体现的是-种模板式设计。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能,但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式。

从使用方式_上来说,二者有如下的区别:
●接口里只能包含抽象方法、静态方法、默认方法和私有方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
●接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
●接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作
●接口里不能包含初始化块,但抽象类则完全可以包含初始化块。
●一个类最多只能有一-个直接父类,包括抽象类;但一-个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

11:说一下你对面向接口编程的理解。

接口体现的是-种规范和实现分离的设计哲学,充分利用接口可以极好地降低程序各模块之间的耦合,从而提高系统的可扩展性和可维护性。基于这种原则,很多软件架构设计理论都倡导“面向接口”编程,而不是面向实现类编程,希望通过面向接口编程来降低程序的耦合。

12:遇到异常,你通常如何处理?

在Java中,可以按照如下三个步骤处理异常:
1.捕获异常
将业务代码包裹在try块内部,当业务代码中发生任何异常时,系统都会为此异常创建一个异常对象。创建异常对象之后,JVM会在try块之后寻找可以处理它的catch块,并将异常对象交给这个catch块处理。
2.处理异常
在catch块中处理异常时,应该先记录日志,便于以后追溯这个异常。然后根据异常的类型、结合当前的业务情况,进行相应的处理。比如,给变量赋予一个默认值、直接返回空值、向外抛出一个新的业务异常交给调用者处理,等等。
3.回收资源
如果业务代码打开了某个资源,比如数据库连接、网络连接、磁盘文件等,则需要在这段业务代码执行完毕后关闭这项资源。并且,无论是否发生异常,都要尝试关闭这项资源。将关闭资源的代码写在finally块内,可以满足这种需求,即无论是否发生异常,finally块内 的代码总会被执行。
异常处理机制见:异常处理

13:说一说hashCode()和equals()的关系。

hashCode()用于获取哈希码( 散列码)
eauq|s()用于比较两个对象是否相等,它们应遵守如下规定:
●如果两个对象相等,则它们必须有相同的哈希码。
●如果两个对象有相同的哈希码,则它们未必相等。