1.重载与重写的区别
面试官:请你谈谈重载与重写的区别
求职者:
方法重写(Override)和方法重载(Overload)都是面向对象编程中,多态特性的不同体现;
方法重写(Override) 是一种语言特性,它是多态的具体表现,它允许子类重新定义父类中已有的方法,且子类中的方法名和参数类型及个数都必须与父类保持一致,这就是方法重写。
方法重载是指在同一个类中,定义了多个同名方法,但同名方法的参数类型或参数个数不同就是方法重载。
区别 | 方法重写 | 方法重载 |
---|---|---|
方法关系 | 描述的是父类和子类的方法关系 | 描述的是同一个类中多个同名方法的方法关系 |
Override关键字 | 需要使用@Override关键字 | 不需要 |
参数类型与个数 | 不能修改 | 必须修改 |
返回类型 | 只能变小或相同,不能变大 | 可修改 |
抛出异常 | 只能变小或删除,不能抛出新的异常或者更大的异常 | 可修改 |
权限控制符 | 只能变大或相同,不能变小 | 可修改 |
方法重写的注意事项:
注意事项 1:子类方法的权限控制符不能变小,也就是如果父类方法的权限控制符是 protected,那么子类的方法权限控制符只能是 protected 或 public;
注意事项 2:子类方法返回的类型只能变小,也就是说如果父类方法返回的是 Number 类型,那么子类方法只能返回 Number 类型或 Number 类的子类 Long 类型,而不能返回 Number 类型的父类类型 Object;
注意事项 3:子类抛出异常的类型只能变小;
注意事项 4:子类方法名必须和父类方法名保持一致;
注意事项 5:子类方法的参数类型和个数必须和父类保持一致。
2.mybatis的优缺点
面试官:请你说出mybatis有哪些有缺点?
求职者:
优点:
1.与JDBC相比,减少了50%以上的代码量,消除了大量冗余的代码,不需要手动开关连接;
2. 基于SQL语句编程,相当灵活,且SQL在XML中,解除sql与程序代码的耦合,提供XML标签,支持编写动态SQL语句,并可重用;
3. Mybatis可以很好的与各种数据库兼容(因为Mybatis底层使用JDBC连接数据库,所以只要是JDBC支持的数据库Mybatis都支持);
4. 能够很好的与Spring集成;
5. 提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。
缺点:
1.SQL语句的编写工作量较大,需要对开发人员编写SQL语句的功底有一定要求;
2.SQL语句依赖于数据库,导致数据库移植性差,不能随意更改数据库。
3.Mybatis中#{}与${}的区别是什么
#{}是预编译处理,是占位符,而${}是字符串替换,是拼接符;
#{}表示一个占位符号 相当于 jdbc中的 ? 符号 #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?;
#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:select * from user where id= #{user_id},如果传入的值是11,那么解析成sql时的值为where id=“11” ;
Mybatis在处理${}时,就是把${}替换成变量的值(不会自动加入双引号),调用Statement来赋值。
#{}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入。
总结来说:如果需要将传入的数据自动加上双引号,则使用#{},若是需要直接使用传入的数据(不加入双引号),则使用${}。