根据牛客网的面试经验的题进行的汇总,里面的内容是看别人的博客或者其东西进行汇总的,将这些的知识总结一下,方便自己查看和复习用
牛客网
面向对象(一)
基础
若对一个类不重写,它的equals()方法是如何比较的?
本质比较的是地址值
请解释hashCode()和equals()方法有什么联系?
hashcode是为了提高equals的效率,因为当数据量非常大的时候,使用equals非常不方便,可以先通过比较hashcode的值,来判断此时是否有与之相同的hashcode
- 相同的hashcode值,equals不一定相同
- hashcode不同,equals不一定相同
- equals相同,hashcode一定相同
- 相同的对象必须具有相等的哈希码
JAVA构造函数
请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
每当一个对象创建时,就会调用构造函数,每个类Java虚拟机都默认有一个无参的构造函数
构造函数的重载是指参数的类型或者个数不一样的情况
复制构造函数,Java没有提供此种方法
方法
请说明Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
覆盖:可以在子父类中用到,当子类重写父类的方法就相当于覆盖了父类的方法,此时的返回值类型,方法名和形参列表都要一样
重载:是指方法名相同但是参数的个数或者类型不同的情况下的方法
接口
请说明Query接口的list方法和iterate方法有什么区别?
-
list():
- 返回的是结果集的list集合,
- 对于查询所有记录,list方法查询所有记录只发送一条sql语句
- list()方法无法利用一级缓存和二级缓存(对缓存只写不读),所以当缓存有记录时,还是会到数据库进行查询
-
iterate():
- iterate返回的是iterator迭代器
- 对于查询所有记录,先查询到满足条件的所有记录id,并不立即查询所有结果,当我们有用到某个记录的话,他才查询。如果显示所有记录的话需要n+1条sql语句。第一条查id,接下去根据id,一条一条查询,所以是n+1条的查询
- iterate()方法可以充分利用缓存,如果目标数据只读或者读取频繁,使用iterate()方法可以减少性能开销
Java对象
请你谈一下面向对象的"六原则一法则"。
- 开闭原则:对扩展开放,对修改关闭,即添加一个方法时,尽量不要修改原来的代码,可以对其进行扩展
- 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立
- 依赖倒置原则:面向接口编程,不要面向实现编程,即声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代
- 单一职责原则:控制类的粒度大小,将对象解耦、提高其内聚性,一个类就专注的做一个任务
- 接口隔离原则:要为各个类建立它们需要的专业接口,臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力,接口也应该是高度内聚的
- 迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话
- 合成复用原则:尽量先使用组合和聚合等关联关系,其次才考虑使用继承关系来实现
写代码最终极的原则只有六个字"高内聚、低耦合",所谓的高内聚就是一个代码模块只完成一项功能
类
请说明如何通过反射获取和设置对象私有字段的值?
public class GetPrivate {
public static void main(String[] args) throws Exception {
Person person = new Person("qqq", 11);
//获取私有属性
Field field = Person.class.getDeclaredField("name");
//设置可以访问此私有属性
field.setAccessible(true);
System.out.println(field.get(person));
field.set(person, "aaa");//重新设置值
System.out.println(field.get(person));
}
}
请说明内部类可以引用他包含类的成员吗,如果可以,有没有什么限制吗?
可以
- 普通内部类
- 可以引用外部类的所有成员和方法
- 普通内部类在逻辑和形态上都与外部类有关系
- 静态内部类
- 可以引用外部类的静态方法和成员
- 其实静态内部类在逻辑上和外部类并没有直接的关系
补充
普通内部类为什么可以引用外部类的成员和方法
- 首先普通内部类默认提供的构造函数内是有参数的,其参数类型是外部类的类型,因此在加载内部类的时候会默认调用外部类(就是内部类持有指向外部类的引用)
- 其次内部类中有外部类的成员变量
java重载
请说明重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
重载:
- 是指除返回值类型以外,其参数的类型和参数的个数或者参数顺序(都)不同的情况下会构成重载
- 编译时多态
重写:
- 是指子类通过重写父类的方法,来实现自己的方法
- 子类的访问修饰权限不能小于父类的
- 子类抛出的异常类型或声明异常的范围不能比父类的大
- 运行时多态
不能根据返回值类型来区分重载
对象
请判断,两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,该说法是否正确,为什么?
不对,在Java中,当equals相同时,其hashcode一定时相同的,而相同的对象具有相同的hashcode值
请判断当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递,传的是地址的值
异常
请说明JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
try…catch…finally:
- 在try中抛出异常,紧跟在catch中捕获异常,finally中有没有异常都会执行,可以用来关闭一些资源
trows:
- 用于可能抛出某种异常,由其调用者接收此异常
- 一般在方法或者类后面声明一个异常类型,可以声明多个,逗号隔开
throw:
- 用于抛出一个自定义的具体的异常
- 如果是运行时异常,需要用throws抛出,或者用try…catch捕获
接口
请说明Java的接口和C++的虚类的相同和不同处。
c++中的虚类相当于Java中的抽象类
- 相同
- 都是抽象类
- 不同
- 接口没有实现的方法体;抽象类有实现的方法体
- 接口可以有多个实现;抽象类只能继承一个
- 接口中的方法只能用public、default;抽象类中的方法可以由public、protected、default、private
声明
请你说说Static Nested Class 和 Inner Class的不同
-
静态内部类
- 具体内部类不能访问外部类的非静态成员和方法
-
内部类
- 可以访问外部类的任意方法和成员
补充
外部类使用内部类的成员和方法
方法一:
Outer.Inner i = new Outer().new Inner();
System.out.println(i.a);//可以调用内部类的任意方法和成员,相当于内部类的对象
方法二:
public Inner getInn() {
return new Inner();
}//在外部类中定义一个获取内部类的方法
Inner inn = new Outer().getInn();