面向对象面试题

类和对象面试题

1. & 和 && 的区别

参考答案

    & 运算符有两种用法:(1) 按位与;(2) 逻辑与。
    && 运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是 true 整个表达式的值才是 true。
    && 之所以称为短路运算是因为,如果 && 左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
    很多时候我们可能都需要用 && 而不是 &,例如在验证用户登录时判定用户名不是 null 而且不是空字符串,应当写为 username != null &&!username.equals(""),二者的顺序不能交换,更不能用 & 运算符,因为第一个条件如果不成立,根本不能进行字符串的 equals 比较,否则会产生 NullPointerException 异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。 

2. 两个对象值相同 (x.equals(y) == true) ,但却可有不同的 hashCode,这句话对不对?

参考答案

    不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hashCode)应当相同。
    Java 对于 eqauls 方法和 hashCode 方法是这样规定的:

    (1) 如果两个对象相同(equals 方法返回 true),那么它们的 hashCode 值一定要相同;
    (2) 如果两个对象的 hashCode 相同,它们并不一定相同。 

3. 构造器(constructor)是否可被重写(override)?

参考答案

   构造器不能被继承,因此不能被(子类)重写。

4. 抽象类 (abstract class) 和接口 (interface) 有什么异同?

参考答案

    不同:
    1. 抽象类中可以定义构造器,接口中不可以。
    2. 抽象类可以有抽象方法和具体方法,接口中只可以有抽象方法。
    3. 抽象类中的成员可以是 private、默认、protected、public,接口中的成员全都是 public 的 (1.9 后可以有私有方法)
    4. 抽象类中可以定义成员变量,接口中定义的成员变量实际上都是常量。
    5. 有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
    6. 抽象类中可以包含静态方法,接口中不能有静态方法(从 1.8 开始可以有)。
    7. 一个类只能继承一个抽象类,一个类可以实现多个接口。
    相同:
    1. 不能够实例化
    2. 可以将抽象类和接口类型作为引用类型
    3. 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类

5. ==和 equals 的区别?

参考答案

    equals 和 == 最大的区别是一个是方法一个是运算符。 
    ==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
    equals():用来比较方法两个对象的内容是否相等。
    注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址。

6. this 和 super 区别?

参考答案

    this 是代表本类对象的引用。 
    super 是代表父类存储空间的标识(可以理解为父类的引用,可以操作父类的成员) 
    怎么用呢? 
    A: 调用成员变量 
        this.成员变量 调用本类的成员变量 
        super.成员变量 调用父类的成员变量 
    B: 调用构造方法 
           this(...)  调用本类的构造方法 
           super(...)  调用父类的构造方法 
    C: 调用成员方法 
        this.成员方法  调用本类的成员方法 
        super.成员方法 调用父类的成员方法 

7. 说出 java.lang.Object 类的常用方法

参考答案

    (1)public boolean equals(java.lang.Object) :比较对象的地址值是否相等,如果子类重写,则比较对象的内容是否相等;
    (2)public native int hashCode() :获取哈希码
    (3)public java.lang.String toString() :把数据转变成字符串
    (4)public final native java.lang.Class getClass() :获取类结构信息
    (5)protected void finalize() throws java.lang.Throwable :垃圾回收前执行的方法
    (6)protected native Object clone() throws java.lang.CloneNotSupportedException: 克隆
    (7)public final void wait() throws java.lang.InterruptedException :多线程中等待功能
    (8)public final native void notify(): 多线程中唤醒功能
    (9)public final native void notifyAll(): 多线程中唤醒所有等待线程的功能 

8. String s=new String(“xyz”); 创建了几个 String 对象?

参考答案

    二个。
    “xyz”放在字符串常量池(如果池中已经存在 xyz 则不会再次创建)。
    new String 放在堆里。

9. 什么是字符串常量池?

参考答案

    字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串。
    在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用。如果不存在,则实例化一个字符串放到池中,并返回其引用。

10. String 类有那些常用方法?

参考答案

     length(): 返回字符串长度
     charAt(): 返回指定索引处的字符
     substring(): 截取字符串
     trim(): 去字符串两端空白
     split(): 分割字符串,返回一个分割后的字符串数组
     replace(): 字符串替换
     indexOf(): 返回指定字符的索引

11. StringBuffer 和 StringBuilder 区别?

参考答案

    StringBuffer 是线程安全的(synchronized),而 StringBuilder 不是,所以 StringBuilder 效率更高,锁的获取和释放会带来开销。

12. 访问控制符区别?

参考答案

访问控制符 当前类 同一包 子类 其他包
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N

13. static 关键字作用?

参考答案

     1.static 变量(静态变量): 不用创建对象,通过类名直接访问
     2.static 方法(静态方法): 不用创建对象,通过类名直接访问
     3.static 代码块(静态代码块): 类加载时执行一次
 

14. final 关键字作用?

参考答案

    1. 修饰类:类不能被继承
    2. 修饰方法:方法不能被重写
    3. 变量:变量值不能被修改

15. 面向对象五大基本原则?

参考答案

    1. 单一职责原则:一个类,最好只做一件事,只有一个引起他的变化。
    2. 开放封闭原则:对扩展开放,对修改封闭。
    3. 里氏替换原则:子类必须能够替换父类。
    4. 依赖倒置原则:依赖于抽象。
    5. 接口隔离原则:使用多个小的专门的接口,不要使用一个大的总的接口。

16. 接口和抽象类区别?

参考答案

不同点 抽象类 接口
关键字 abstract interface
实现 extends implements
构造函数
属性 随意 static final

17. 重载和重写区别?

参考答案

    重载:在同一个类中,方法名相同参数列表不同。与方法返回值和访问修饰符无关。
    重写:发生在父子类中,方法名、参数列表相同。抛出异常小于等于父类,访问修饰符大于等于父类。

18. Java 创建对象有几种方式?

参考答案

    Java 中提供了以下四种创建对象的方式:
    1. new 创建新对象
    2. 通过反射机制
    3. 采用 clone 机制
    4. 通过序列化机制

19. Java 中会存在内存泄漏吗?请简单描述。

参考答案

    理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题;然而在实际开发中也会。
    Java 中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是 Java 的内存泄露。

20. 说明内存泄漏和内存溢出的区别和联系?

参考答案

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;比如申请了一个 integer, 但给它存了 long 才能存下的数,那就是内存溢出。
    内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
    memory leak 会最终会导致 out of memory!

你可能感兴趣的:(Java面试真题精讲,java,开发语言,面试)