以下是互联网大厂 Java 求职者面试三轮问答及答案:
第一轮:
面试官:请你讲讲 Java 的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这八种。 面试官:那这些数据类型在内存中的存储大小分别是多少呢? 王铁牛:byte 占 1 个字节,short 占 2 个字节,int 占 4 个字节,long 占 8 个字节,float 占 4 个字节,double 占 8 个字节,char 占 2 个字节,boolean 占 1 位。 面试官:不错,那你说说 Java 中的面向对象特性有哪些? 王铁牛:有封装、继承、多态。
第二轮:
面试官:请你解释一下 Java 中的封装是如何实现的? 王铁牛:通过将数据和操作数据的方法封装在一个类中,对外提供公共的方法来访问和修改数据,隐藏内部的实现细节,这样可以提高代码的安全性和可维护性。 面试官:那继承呢?在 Java 中继承的语法是怎样的? 王铁牛:继承是子类继承父类的属性和方法。语法是使用“extends”关键字,例如 class ChildClass extends ParentClass { } 。 面试官:多态又是什么呢?如何实现多态? 王铁牛:多态是指同一个操作作用于不同的对象可以有不同的表现形式。通过方法重写和向上转型来实现多态,在父类中定义一个方法,在子类中重写该方法,然后通过父类的引用调用该方法时,会根据实际对象的类型来调用相应的子类方法。
第三轮:
面试官:说说 Java 中的多线程是怎么回事? 王铁牛:多线程就是在一个程序中可以同时执行多个线程,每个线程可以独立执行不同的任务,提高程序的并发性能。 面试官:那线程的创建方式有哪些呢? 王铁牛:可以通过继承 Thread 类或者实现 Runnable 接口来创建线程。继承 Thread 类时重写 run 方法,实现 Runnable 接口时实现 run 方法并将其作为参数传递给 Thread 构造函数。 面试官:线程的生命周期有哪些状态呢? 王铁牛:有新建、就绪、运行、阻塞、死亡这几种状态。新建状态是线程对象刚创建时;就绪状态是线程对象创建后调用 start 方法准备执行时;运行状态是线程正在执行代码;阻塞状态是线程因等待某个条件而暂停执行;死亡状态是线程执行完毕或因异常而终止。
面试官总结:今天的面试就到这里,你回去等通知吧。感谢你参加面试。
答案详细讲述技术点:
- Java 基本数据类型:基本数据类型是 Java 语言中最基本的数据单元,每种数据类型都有固定的大小和取值范围。byte 用于表示字节数据,范围是 -128 到 127;short 表示短整数,范围是 -32768 到 32767;int 是整数类型,范围较大;long 表示长整数,用于处理较大的整数值;float 是单精度浮点数;double 是双精度浮点数;char 用于表示字符;boolean 只有 true 和 false 两个值。
- 面向对象特性:
- 封装:将数据和操作数据的方法封装在一个类中,隐藏了内部实现细节,只对外提供公共的接口,这样可以防止外部直接访问和修改内部数据,提高了代码的安全性和可维护性。例如,在一个 Person 类中,可以将姓名、年龄等属性封装起来,通过 setName()、getName()等方法来访问和修改。
- 继承:继承是面向对象编程的重要特性之一,它允许一个类继承另一个类的属性和方法,从而实现代码的复用。子类可以继承父类的非私有属性和方法,并可以在子类中进行扩展或重写。例如,Animal 类有 eat()方法,Dog 类继承自 Animal 类,可以继承 eat()方法并添加自己特有的 bark()方法。
- 多态:多态是指同一个操作作用于不同的对象可以有不同的表现形式。在 Java 中,多态通过方法重写和向上转型来实现。方法重写是在子类中重新定义父类的方法,以实现不同的行为;向上转型是将子类对象赋值给父类引用,在调用方法时,根据实际对象的类型来调用相应的子类方法。例如,有一个 Animal 类和 Dog、Cat 等子类,它们都有一个 move()方法,在运行时,根据实际对象的类型来调用不同的 move()方法。
- 多线程:多线程是在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务,提高程序的并发性能。线程的创建方式有继承 Thread 类和实现 Runnable 接口两种。继承 Thread 类时,需要重写 run()方法,在 run()方法中编写线程的执行逻辑;实现 Runnable 接口时,需要实现 run()方法,并将实现了 Runnable 接口的对象作为参数传递给 Thread 构造函数。线程的生命周期包括新建、就绪、运行、阻塞、死亡等状态,通过调用 start()方法可以将线程从新建状态转换为就绪状态,然后由操作系统调度执行,进入运行状态,当线程执行完毕或因异常而终止时,进入死亡状态。在多线程编程中,需要注意线程的同步和互斥,以避免出现数据竞争和死锁等问题。