面试汇总——JavaSE——面向对象(一)

根据牛客网的面试经验的题进行的汇总,里面的内容是看别人的博客或者其东西进行汇总的,将这些的知识总结一下,方便自己查看和复习用
牛客网

面向对象(一)

基础
若对一个类不重写,它的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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值