2022 12月7日 每日面试题

简介: 2022 12月7日 每日面试题

正文开始 ----------


2022 12月7日 每日面试题

1、谈谈你对面向对象的理解 ?

面向对象的三大基本特征 :封装、继承、多态。

其中,封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,让外部程序通过该类提供的方法来实现对内部信息的操作和访问,这种做法有助于规范使用者的行为,让使用者只能通过事先预定的方法访问数据,提高了代码的可维护性;

继承是面向对象实现代码复用的重要手段,Java通过extends作为关键字实现类的继承,实现继承的类被称为子类,被继承的类称为父类(有的也被称为基类和超类),父类和子类的关系是一种一般和特殊的关系;

多态的实现离不开继承,在设计程序时,我们可以将参数的类型定义为父类型。在调用程序时,则可以根据实际情况,传入该父类型的某个子类型的实例,这样就实现了多态。对于父类型,可以有三种形式,即普通的类、抽象类、接口。对于子类型,则要根据它自身的特征,重写父类的某些方法,或实现抽象类/接口的某些抽象方法。

2、类中静态代码块、实例代码块、构造方法执行次序 ?

1、父类静态代码块优先于子类静态代码块执行,而且是最早执行


2、父类实例方法和父类构造方法紧接着执行


3、子类的实例代码块和子类的构造方法紧接着再执行


4、第二次实例化对象时,父类和子类的静态代码块都将不会再执行


5、静态代码块先执行,并且只执行一次,在类加载阶段执行


6、如果类没有加载,先加载类:先加载基类,后加载子类,基类的静态代码块先执行,子类的代码块后执行,并且都只执行一次


7、当有对象创建的时候,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行


注意:


new哪个类的对象,编译器就会调用该类的构 造方法

new子类对象:编译器会调用子类的构造方法

从基类继承下来的成员变量,通过super()调用基类构造方法

子类新增加的成员

基类构造方法中的内容先打印,然后子类构造方法中的内容后打印

3、说说你对AOP的理解

AOP是一种编程思想,是通过预编译方式和运行期间动态代理的方式实现不修改源码的情况下给程序动态统一添加功能的技术。面向对象编程将程序抽象成各个层次的对象,而面向切面编程则将程序抽象成各个切面。所谓切面,相当于应用对象之间的横切点,我们可以将其单独 抽象为单独的模块。

AOP技术利用一种称为横切的技术剖解开封装对象的内部,将影响多个类的公共行为封装到一个可重用的模块中,并将其命名为切面。所谓的切面,简单来说就是与业务无关,却为业务模块所共同调用的逻辑,将其封装起来便于减少系统的重复代码,降低模块的耦合度,有利用未来的可操作性和可维护性。

利用AOP可以对业务逻辑各个部分进行隔离开来,从而使业务逻辑部分之间的耦合度降低,提高程序的可重用性,提高开发效率。

AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式。

JDK动态代理 : 这是Java提供的动态代理技术,可以在运行时创建接口的动态实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。

CGLIB动态代理 :采用底层的字节码技术,在运行时创建子类的代理的实例。当目标对象不存在接口的时候,Spring AOP就会采用这种方式,在子类实例中织入代码。

在应用场景方面,Spring AOP为IOC的使用提供了更多的便利,一方面,应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活地编制到模块中,比如可以通过AOP实现应用程序中的日志功能。另一方面,在Spring内部,例如事务处理之类的一些支持模块也是通过Spring AOP来实现的。

4、谈谈你对IOC的理解

IOC是控制反转的意思,是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高,在一个大型的项目中这十分的不利于代码的维护。IoC则可以解决这种问题,它可以帮我们维护对象与对象之间的依赖关系,并且降低对象之间的耦合度。

说到IOC就不得不说说DI,DI是依赖注入的意思,它是IOC实现的实现方式。由于IOC这个词汇比较抽象而DI比较直观,所以很多时候我们就用DI来代替它,在很多时候我们简单地将IOC和DI划等号,这是一种习惯。实现依赖注入的关键是IOC容器,它的本质就是一个工厂。

5、请说说你对反射的了解

Java程序中,许多对象在运行时都会有编译时异常和运行时异常两种。例如多态的情况下Car c = new Animal(); 这行代码运行时会生成一个c变量,在编译时该变量的类型是Car,运行时该变量类型为Animal;另外还有更极端的情况,例如程序在运行时接收到了外部传入的一个对象,这个对象的编译时类型是Object,但程序又需要调用这个对象运行时类型的方法,这种情况下,有两种解决方法:第一种做法是假设在编译时和运行时都完全知道类型的具体信息,在这种情况下,可以先使用instanceof运算符进行判断,再利用强制类型转换将其转换成其运行时类型的变量。第二种做法是编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。

具体来说,通过反射机制,我们可以实现如下的操作:

程序运行中,可以通过反射创建任意一个类的实例,并访问该实例的成员。

程序运行中,可以通过反射机制生成一个类的动态代理类或动态代理对象。

Java的反射机制在实际项目中应用广泛,常见的应用场景有:

使用JDBC时,如果要创建数据库的连接,则需要先通过反射机制加载数据库的驱动程序。

多数框架都支持注解/XML配置,从配置中解析出来的类是字符串,需要利用反射机制实例化;

面向切面编程(AOP)的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现。

6、说说你对ArrayList的理解

ArrayList是基于数组实现的,它的内部封装了一个Object[]数组。通过默认的构造器创建容器时,该数组首先被初始化为空数组,之后在首次添加数据时初始化长度为10。我们也可以使用有参构造器来创建容器,并通过参数来显示的指定数组的容量,此时该数组被初始化为指定容量的数组。

如果向ArrayList中添加数据会造成超出数组长度限制,则会触发自动扩容,然后再添加数据。扩容就是数组拷贝,将旧数组的内容拷贝到新的数组中,而新数组的长度为原来数组长度的1.5倍。

ArrayList支持缩容,但不会自动缩容,即便是ArrayList中只剩下少量数据时也不会主动缩容。如果我们希望缩减ArrayList的容量,则需要自己调用它的trimToSize()方法,届时数组将按照元素的实际个数进行缩减。

Set、List、Queue都是Collection的子接口,它们都继承了父接口的iterator()方法,从而具备了迭代的能力。但是,相比于另外两个接口,List还单独提供了listIterator()方法,增强了迭代能力。iterator()方法返回Iterator迭代器,listIterator()方法返回ListIterator迭代器,并且ListIterator是Iterator的子接口。ListIterator在Iterator的基础上,增加了向前遍历的支持,增加了在迭代过程中修改数据的支持。

7、说说Spring Boot的自动装配

使用Spring Boot时,我们需要引入对应的Starters,Spring Boot启动时便会自动加载相关依赖,配置相应的初始化参数,以最快捷、简单的形式对第三方软件进行集成,这便是Spring Boot的自动配置功能。

整个自动装配的过程是 : SpringBoot 通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各种AutoConfiguration类,当某个AutoConfiguration类满足其注解@Conditional指定的生效条件时,实例化该AutoConfiguration类中定义的Bean(组件等),注入Spring容器,就可以完成依赖框架的自动配置

@EnableAutoConfiguration 作用 从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器 只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置 @EnableAutoConfiguration还可以根据class来排除(exclude),或是根据class name(excludeName)来排除 其内部实现的关键点有 1. ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中 2. SpringFactoriesLoader 该类可以从classpath中搜索所有META-INF/spring.factories配置文件,并读取配置

8、请你说说Java的特点和优点,为什么要选择Java?

Java是一门非常纯粹的面向对象的编程语言,它在吸收C++语言优点的同时去除了C语言中令人难以理解的多继承,指针等概念。所以Java语言在保证了强大功能的基础上,还比C++语言更为简单易用。

Java语言极好的实现了面向对象理论,是静态面向对象语言的代表,它的存在保证了程序员可以用优雅的思维方式进行复杂的编程 。

Java还拥有平台的独立性,可以做到"一次编译,到处运行"。Java还提供了很多内置的类库,,通过这些类库,简化了开发人员的程序设计工作,缩短了项目的开发时间,最重要的是Java提供了垃圾回收器,这也将开发人员从对内存的管理中解脱出来。同时Java拥有良好的安全性和健壮性,Java语言常常使用在网络环境中,为了增强程序的安全性,java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和Bytecode校验等)。Java的强类型机制、垃圾回收器、异常处理和安全检查机制使用Java语言编写的程序有很好的健壮性

此外,Java还提供了对Web应用开发的支持。例如Applet、Servlet和JSP可以用来开发Web应用程序;Socket、RMI可以用来开发分布式应用程序的类库。

JVM(Java虚拟机)是Java跨平台的关键。在运行程序之前,Java源代码(.java)需要经过编译器,将源代码翻译为字节码(.class),但字节码不能直接运行,所以必须通过JVM将字节码翻译为特定平台的机器码运行程序。但跨平台的是Java程序、而不是JVM,所以需要在不同平台下安装不同版本的JVM。

9、介绍一下Spring MVC的执行流程

用户点击某个路径,发起HttpRequest请求,该请求会被提交到DispacherServelet;

由 DispatcherServlet 请求一个或多个处理器映射器(HandlerMapping),并返回一个执行链(HandlerExecutionChn)。

DispatcherServlet将执行链返回的Handle信息发送给处理器适配器(HandlerAdapter);

HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler方法(常称为 Controller);

Handle执行完毕之后会返回给HandleAdapter一个ModelAndView对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);

HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;

DispatcherServlet接收到ModelAndView 对象后,会请求视图解析器(ViewResolver)对视图进行解析;

ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;

DispatcherServlet 接收到具体的 View 视图后,进行视图渲染。

最后将渲染的视图返回给用户。

10、在MyBatis中$和#有什么区别

使用$设置参数时,MyBatis会创建普通的SQL语句,然后在执行SQL 语句时将参数拼入SQL,而使用#设置参数时,MyBatis会创建预编译的SQL语句,然后在执行SQL时MyBatis会为预编译SQL中的占位符赋值。预编译的SQL语句执行效率高,并且可以防止注入攻击,效率和安全性都大大优于前者,但在解决一些特殊问题,如在一些根据不同的条件产生不同的动态列中,我们要传递SQL的列名,根据某些列进行排序,或者传递列名给SQL就只能使用¥。


目录
相关文章
|
NoSQL Java 编译器
面试题30天打卡-day26
面试题30天打卡-day26
48 0
|
存储 XML Java
面试题30天打卡-day13
面试题30天打卡-day13
45 0
|
Java 关系型数据库 MySQL
面试题30天打卡-day03
面试题30天打卡-day03
27 0
|
安全 Java 关系型数据库
面试题30天打卡-day10
面试题30天打卡-day10
51 0
|
6月前
|
存储 程序员 编译器
C++面试题其二
extern "C" 用于告诉编译器按照C语言的链接方式处理代码,通常用于C++代码与C代码混合编程,以防止因名字修饰(name mangling)引起的链接错误。例如: extern "C" { void c_function(); } 通过这些问题的深入理解和解答,能够更好地掌握C++编程的核心概念和实际应用,为面试做好充分的准备。
77 1
|
7月前
面试题 03.04:化栈为队
面试题 03.04:化栈为队
37 5
|
7月前
|
网络协议 NoSQL 数据库
C++面试题
C++面试题
|
NoSQL 关系型数据库 应用服务中间件
面试题30天打卡-day15
面试题30天打卡-day15
44 0
|
设计模式 负载均衡 Java
面试题30天打卡-day25
面试题30天打卡-day25
29 0
|
存储 Java 数据库连接
面试题30天打卡-day17
面试题30天打卡-day17
36 0