JAVA基础面试题

1.抽象类和接口的关系和区别,以及你在时间开发过程中是怎么使用到的?

  抽象类:

    1.抽象类必须用abstract修饰

    2.如果一个类有abstract方法,那么这个类一定是抽象类

    3.抽象类不一定有抽象方法

    4.抽象类可以有自己的变量

    5.如果继承抽象类,没有实现所有抽象方法,那么它也为抽象类

    特性:抽象类是用来捕捉子类的通用特性的,他不能被实例化,只能作用于子类的超类,抽象类是用来创建继承层级里子类的模板

  接口:

    1.接口的定义关键字为interface

    2.接口中只能有方法和变量  变量为 public static final 类型  方法只能被public 修饰,默认public,方法不能有具体的实现

    3.一个类可以实现多个接口

    4.一个类实现接口,就必须要实现接口的全部方法

    特性:接口是抽象方法的集合,如果一个类实现看某个接口,那么它就继承了这个类的抽象方法,实现了这个接口,就必须确保使用这些方法。接口只是一种形式,接口本身不能做任何事情

  抽象类跟接口的区别:

  我们应该在什么时候使用抽象类和接口?

   在java中百分之90都是使用接口,抽象类只是实现一个过渡,抽象类定义的抽象方法与接口定义的方法不同,抽象类定义方法父类不要求子类强制复写,接口定义的方法子类必须复写

  如果你用一些方法,并且想让他们中的一些有默认实现,那么就使用抽象类。

  如果想实现多重继承,那么必须使用接口,java不支持多继承,利用接口可以多继承。

  如果基本功能在不断的改变,那么就需要使用抽象类(如果是接口的话那就需要改变所有实现该接口的实现类)

2.你知道反射机制和动态代理吗?

  反射:反射机制是指JAVA在运行时有一种自观能力。在运行中,对任意一个类,都能够获取这个类的所有属性和方法,对于任意一个对象都能调用它的任意一个方法和属性(包括私有的方法和属性)。这是一种动态获取类的信息以及动态调用方法的一种能力。

    优点:动态编译,动态加载。

    缺点:执行效率低,破坏了JAVA三大特性中的继承特性

 动态代理:JAVA动态代理分为两种 ,动态代理主要是为了分离接口实现类中方法的基本业务和主要业务,在不影响主要业务的同时对方法进行预处理或者后续增强处理。    

    基于JDK动态代理:基于接口方式(代理类和目标类都实现同一个接口)    1.InvocationHandler(in为K询  接口)、2.Proxy(pa kc 类)

       实现:1.通过实现InvocationHandler接口创建自己的调用处理器 2.通过Proxy类指定ClassLoader对象和一组interface(in9feis)来创建动态代理类

          3.通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型。4.通过构造函数创建动态代理类实例,构造是调用处理器对象作为参数传递。

      源码中:1.生成代理类对象2.使用指定的调用处理程序获取代理类的构造函数对象3.检查代理类作用域是否私有,如果私有则设置setAccessible(Eke赛sbo)支持访问4.获取Proxy Class构造函数 创建Proxy 代理实例

    基于CGLIB动态代理:CGLib动态代理是代理类去继承目标类,通过生成类字节码实现代理。目标类不能为final类

        PS:比反射要快且不存在性能问题。

        实现:1.引入CGLIBjar包,2.创建代理类且实现目标类 声明一个被代理类属性(Object类型)   声明一个构造方法将目标类传递进来赋值 3.声明一个创建代理对象的方法,intercept()方法。4.在该方法中创建Enhancer(恩嗨起儿)实例对象 并且设置被代理对象(被代理对象.class),设置回调函数 调用Enhancer.create()方法

  区别:1.JDK动态代理是实现了被代理对象的接口,CGLIB是继承了被代理对象。

     2.JDKg和CGLIB都是在运行期间生产类字节码,JDK是直接写字节码,CGLIB是用ASM框架写Class字节码。CGLIB实现原理更复杂,生产代理类比JDK效率低

       3.JDK调用代理方法是通过发射机制调用,CGLIB是通过FastClass机制直接调用方法,CGLIB执行效率更高。因为他的底层方法全部存放在一个数组中通过数组索引直接进行方法调用

3.一个线程连续两次调用start方法会发生什么?简单谈谈线程的几种状态?

  答:1.JAVA线程是不允许启动两次的,第二次启动会抛出异常,这是一种运行时异常,多次调用会被认为编程错误。 

    2.新建状态(new) :新创建的线程,还未执行。

    3.就绪状态(Runnable):执行了start()方法,等待运行。

    4.运行状态Running):就绪状态的线程开始执行代码

      5.阻塞状态(Blocked):1)同步阻塞:在运行过程中,需要拿到锁才能运行。而锁被其他资源占用,需要等待。

                 2)等待阻塞:执行了wait()方法,进入了等待。

                 3)其他阻塞:执行了join()方法sleep()方法,进入了等待。

    6.终止状态(Terminated):运行完run()方法后结束,或者因遇到异常而终止

4.springmvc实现原理?

  答:客户端发送请求->前端控制器接受客户端请求->映射处理器HandlerMapping解析查找到对应handler->适配器根据handler调用处理器处理请求->处理器返回一个模型视图ModeAndView->视图解析器进行解析->返回一个视图对象->前端控制器渲染数据->将得到的视图返回给用户。

5.mybatis中#$的区别?

  答:1.两者都是动态的像sql语句中传入参数。2.#号传入的参数在sql中显示为字符串。3.$传入的参数在sql中直接显示为传入的值。

    3.#可以防止sql注入的风险(语句拼接)4.使用order by 就需要使用$

7.你知道索引失效嘛?举例看看?

  答:1.有OR的情形下,即使条件中包含索引,也不会使用索引查询。注意:要想使用or,又想索引生效,只能将or条件中的每个列都加上索引

    2.符合索引未引用左列字段。3.like以%号开头4.需要类型转换5.where中索引列有运算。6.where中索引列使用了函数。7.mysql认为全表扫描更快时。

8.多态在实际项目的使用?

  答:1.增加代码的健壮性,只管按照父类的设计进行操作,根据不同需求使用不同的子类。维护起来更加方便。

    2.父类定义通用的属性和方法,多个子类去实现可以省略这些公用代码。当需要扩展的时候只需要修改父类。

    3.可以解耦合。

9.你知道Spring IOC吗?Spring是怎么创建对象的?

  答:IOC指的是控制反转(是一种思想)IOC容器负责实例化,定位,配置应用程序中的对象及建立这些对象之间的依赖。交由spring容器进行统一管理,进而实现松耦合。

   IOC实现原理:反射+XML技术

  spring创建对象的三种方式:1.构造函数,通过无参构造函数+setter方法注入值。(XML中配置对象属性值以及类唯一标识 通过读取XML调用set方法).利用有惨构造函数直接注入。 (XML读取属性值通过构造方法直接注入)

               2.通过静态方法创建对象。(XML中声明类的静态方法,spring 初始化解析该类时会执行)

               3.通过工厂方法创建对象。(XML声明工厂实例,在创建对象将值赋给工厂)

      

原文地址:https://www.cnblogs.com/qi2332356/p/13371200.html