1.请简述Java的继承,重写和多态的概念和运用
继承是一种Java中重要的面向对象编程方式,它允许一个类从另一个类继承某些属性和方法,在这种关系下,子类可以重写父类的方法,从而实现不同的行为。
多态是继承实现的一种关键概念,它允许一个对象以多种形式实现某个方法,通过这种方式,代码可以更加灵活,并提高代码的可扩展性和可重用性。
2.Java中的数组和列表有什么区别?
数组:数组长度是固定的,旨在存储具有相同类型的数据,而列表用于存储大量的数据,可以存储任何类型的数据。
列表:具有可变长度,可以在运行时动态添加或删除元素。
3.什么是Java中常见的运行时异常?
常见的Java运行时异常包括NullPointerException(空指针异常)、ArithmeticException(算术异常)、ArrayIndexOutOfBoundsException(数组越界异常),这些异常通常会在程序运行时抛出,导致程序崩溃或者运行不正确的结果。
4.请简述Java的线程和同步机制。
线程:Java程序的执行单元,允许程序并行执行。
同步机制:一种用于协调多个线程之间访问共享数据的方法,它可以避免资源冲突和数据竞争,确保线程之间的正确交互。
5.线程、进程、多线程、线程池
线程:是指进程中的一个单独的执行路径。一个进程可以包含多个线程,每个线程都可以并行执行不同的任务。
多线程:是指在同一时间内运行多个线程来完成多个任务。多线程提高程序的性能和响应速度。但是增加了代码的复杂性,同时需要考虑线程安全和死锁等问题。
线程池:是一组预先创建的线程,它们可以被重复使用来执行多个任务。使用线程池可以避免在创建和销毁线程时产生额外的开销,从而提高程序的性能。Java 中提供了 Executor 框架来实现线程池。
6.请举例说明Java中的面向对象编程(OOP)原则。
面向对象编程原则包括封装、继承和多态
封装:指将数据和方法组合成一个类中,以允许访问控制;
继承:允许类从另一个类继承属性和方法;
多态:允许一个对象用不同形式表示某个方法的实现。
7.讲一下你对Java中反射的理解和应用场景。
反射:Java中一种常用的高级特性,它允许在运行时动态获取类的信息,并且可以在运行时动态调用类的方法和修改类的属性。
Java中的反射被广泛应用于框架和插件的开发中。
8.如何在Java中使用泛型以及它们的优点和缺点?
泛型是Java中一种强类型
优点:约束和类型安全的编程方式,它可以在运行时检查数据类型,抑制类型转换异常,并提高代码的可读性和重用性。
缺点:可能导致运行时效率下降,会导致代码复杂性增加,限制范围窄
Java中的泛型被广泛应用于数据结构、集合类、IO操作和注解等领域。
9.Java 8中新特性包括哪些,它们有什么优点?
Java 8中引入了一些新特性,包括Lambda表达式、方法引用、默认方法、Stream API、时间日期API等。
这些新特性使得Java更加现代化、简洁和灵活,并且可以提高代码的可读性、可维护性和可扩展性。
10.如何在Java中处理大文件?请举例说明。
在处理大文件时,Java可以使用多种技术以提高性能和减少内存占用。其中,常用的技术包括分块处理、基于内存映射的IO、基于缓存的IO等。这些技术可以通过Java中的File类、BufferedReader、BufferedWriter、FileChannel等API实现。
11.Java中多态的实现原理
Java中的多态是面向对象编程的一个重要特性,它允许一个类的对象表现出多种形态。多态的实现主要依赖于继承和接口,通过方法重写和接口实现来实现。
实现原理: 多态的实现原理主要依赖于Java的动态方法分派机制。当一个子类重写了父类的方法时,Java运行时系统会根据对象的实际类型来决定调用哪个方法。这个过程是在运行时进行的,而不是在编译时。这使得我们可以通过父类引用来调用子类的方法,实现多态的特性。
12.JVM中的垃圾回收器是如何工作的?
垃圾回收器是Java虚拟机的一种组成部分,它负责自动回收不再使用的对象,并释放内存空间。
垃圾回收器通常采用分代回收机制,即把Java对象分为不同的代,按照不同的策略进行自动回收。
13、Java 中 IO 流的分类
Java中的流可以按照数据的类型和传输的方向来分类,分别由四个抽象类来表示
按照数据的类型,流分为字节流和字符流:
字节流:InputStream,OutputStream。字节流按照8位传输,可以处理任何类型的数据,包括二进制数据。
字符流: Reader,Writer。字符流按照16位传输,只能处理字符或者字符串,可以直接处理Unicode字符。
按照传输的方向,流分为输入流和输出流:
输入流:InputStream,Reader。输入流用于从数据源读取数据到内存中。
输出流:OutputStream,Writer。输出流用于从内存中写出数据到目标位置。
14、字节流和字符流的区别
字节流和字符流的区别主要在于处理数据的类型不同:
字节流可以处理任何类型的数据,包括二进制数据,而字符流只能处理字符或者字符串;
字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
字节流在读写文本数据时,需要进行编码和解码的转换,而字符流则不需要。
15、JDK 和 JRE 有什么区别?
JDK:Java开发工具包
JRE:Java运行环境
JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。
16.final 在 java 中有什么作用?
(1)用来修饰一个引用
如果引用为基本数据类型,则该引用为常量,该值无法修改;
如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
(2)用来修饰一个方法
当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
(3)用来修饰类
当用final修改类时,该类成为最终类,无法被继承。
17.八种基本数据类型
1、整型
byte 、short 、int 、long
2、浮点型
float 、 double
3、字符型
char
4、布尔型
boolean
18、普通类和抽象类有哪些区别?
抽象类不能被实例化;
抽象类可以有抽象方法,只需申明,无须实现;
有抽象方法的类一定是抽象类;
抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类;
抽象方法不能声明为静态、不能被static、final修饰。
19、接口和抽象类有什么区别?
(1)接口
接口使用interface修饰;
接口不能实例化;
类可以实现多个接口;
①java8之前,接口中的方法都是抽象方法,省略了public abstract。
②java8之后;接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现;
(2)抽象类
抽象类使用abstract修饰;
抽象类不能被实例化;
抽象类只能单继承;
抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体;
如果一个类继承了抽象类,①如果实现了所有的抽象方法,子类可以不是抽象类;②如果没有实现所有的抽象方法,子类仍然是抽象类。
20、throw 和 throws 的区别?
(1)throw
作用在方法内,表示抛出具体异常,由方法体内的语句处理;
一定抛出了异常;
(2)throws
作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;
可能出现异常,不一定会发生异常;