【Java核心面试宝典】Day7、面向对象常见面试题汇总(二)

举报
灰小猿 发表于 2021/08/04 07:53:36 2021/08/04
【摘要】 Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!用坚持缔造技术、用指尖敲动未来!和很多小伙伴们一样,我也是一名奔波在Java道路上的“创造者”。也想靠技术来改未来,改变世界!因为我们坚信每一次敲动键盘都能让生活变得更智能、世界变得更有趣!在此专栏《Java核心面试宝典》记录我们备战梦想的【day 7】!上一篇文章和大家分享在面向对象方面的一些常见面试题,但是比较多就只分享了在构造方...

Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!
用坚持缔造技术、用指尖敲动未来!
和很多小伙伴们一样,我也是一名奔波在Java道路上的“创造者”。也想靠技术来改未来,改变世界!因为我们坚信每一次敲动键盘都能让生活变得更智能、世界变得更有趣
在此专栏《Java核心面试宝典》记录我们备战梦想的【day 7】

上一篇文章和大家分享在面向对象方面的一些常见面试题,但是比较多就只分享了在构造方法和静态实例方面的题目,今天就继续来和大家总结剩下的面试题。
在这里插入图片描述

1、静态初始化块和非静态初始化块的执行顺序是什么?以及分别会执行多少次?

静态初始化块的优先级最高,会最先执行,在非静态初始化块之前执行,静态初始化块只在类第一次被加载时执行, 非静态初始化块会在每次创建对象时执行一次,因此创建了多少个对象,就会执行多少次非静态初始化块。

2、静态初始化块和main方法哪个先执行?

静态初始化块会在类第一次被加载时执行,而main方法是在类中定义的方法,所以静态初始化块会在main方法执行之前执行。

3、存在继承关系的初始化块的执行顺序是怎样的?

如果存在继承关系,则在子类进行类加载和创建对象时,也会对父类进行类加载和创建对象,执行顺序仍然是静态初始化块、非静态初始化块、构造器。
如对于两个类,一个子类一个父类的情况,执行顺序如下:

  1. 执行父类的静态初始化块
  2. 执行子类的静态初始化块
  3. 执行父类的非静态初始化块
  4. 执行父类的构造器
  5. 执行子类的非静态初始化块
  6. 执行子类的构造器

追问:如果不止两个类的继承呢?应该按照什么顺序执行?

对于多个类之间的继承,执行顺序如下:

  1. 按照从父类到子类的顺序,依次执行每个类的静态初始化块
  2. 按照从父类到子类的顺序,对于每个类,依次执行非静态初始化块和构造器,然后执行子类的非静态初始化块和构造器,知道所有类执行完毕。

可能逻辑性有些有些强,我通过一个实例代码给大家演示一下:

以下代码可以说明初始化块和构造器的执行顺序。代码中定义了四个类,分别是 Main、Class1、Class2 和 Class3,其中 Class2 是 Class1 的子类,Class3 是 Class2 的子类,每个类都有静态初始化块、非静态初始化块和构造器。静态方法 main 定义在 Main 中,创建了 Class3 的实例。

public class Main {
    static {
        System.out.println("Static initialization of Main");
    }

    {
        System.out.println("Instance initialization of Main");
    }

    public Test() {
        System.out.println("Constructor of Main");
    }

    public static void main(String[] args) {
        new Class3();
    }
}

class Class1 {
    static {
        System.out.println("Static initialization of Class1");
    }

    {
        System.out.println("Instance initialization of Class1");
    }

    Class1() {
        System.out.println("Constructor of Class1");
    }
}

class Class2 extends Class1 {
    static {
        System.out.println("Static initialization of Class2");
    }

    {
        System.out.println("Instance initialization of Class2");
    }

    Class2() {
        System.out.println("Constructor of Class2");
    }
}

class Class3 extends Class2 {
    static {
        System.out.println("Static initialization of Class3");
    }

    {
        System.out.println("Instance initialization of Class3");
    }

    Class3() {
        System.out.println("Constructor of Class3");
    }
}



由于没有创建 Main 的实例,因此 Main 的非静态初始化块不会被执行,但是由于程序的入口即静态方法 main 定义在 Main 中,因此 Main 的静态初始化块首先被执行。

在方法 main 中创建了 Class3 的实例,按照父类到子类的顺序,依次执行每个类的静态初始化块,因此 Class1、Class2 和 Class3 的静态初始化块被依次执行。

在所有类的静态初始化块被执行之后,按照父类到子类的顺序,依次执行每个类的非静态初始化块和构造器,因此按照 Class1、Class2 和 Class3 的顺序,每个类的非静态初始化块和构造器被执行。

4、关键字this的含义是什么?

关键字this代表当前对象的引用,当前对象指的是调用类中的属性或方法的对象。

5、关键字this在方法中以及在构造方法中分别表示什么?

关键字this可以用于引用对象的属性,在方法和构造方法中都可以通过关键字this来引用对象的属性,在构造方法中,通过this还可以引用其他的构造方法。

6、关键字this是否可以在静态方法中使用?说明理由!

关键字this不可以在静态方法中使用,因为关键字this代表的是对象的引用,而静态方法不依赖于类的具体对象。

7、如果类成员不加任何修饰符,可以从哪里访问到该类成员?

不加任何可见性的修饰符为默认修饰符,在同一个包下的任何类都可以访问。

可见性修饰符 类内访问 包内访问 从不同包访问
public 可以 可以 可以
默认 可以 可以 不可以
private 可以 不可以 不可以

8、可见性修饰符public和private分别表示可以从哪里访问类成员?

可见性修饰符public表示可以从任何类中访问,可见性修饰符private表示类成员只能从自身所在的类中访问。

9、什么是数据域封装?为什么要使用数据域封装?

数据域封装是对数据域使用private修饰符,将数据域声明为私有域,使用数据域封装的目的是避免从类的外部直接修改数据域的值。

10、在使用数据域之后,应如何读取和修改数据域的值?

可以编写get方法获取数据域的值,编写set方法修改数据域的值。

11、String类型的值是否可变?对String类型的值进行修改操作是否修改了String的内容?

由于String源码中,存储字符串内容的数组使用关键字final修饰的,因此String类型的值不可变,对String类型的值进行修改没有修改String的内容,而是创建了新的String对象。

补充:关于String类型的值不能修改的原因还有另外一种说法,因为我们知道final修饰的数组的value内容有时候也是可以修改的,只是value不能指向其他的数组对象,具体为什么不能修改,其实是因为String中存储字符串内容的数组是private类型的,并且String类中并没有对外提供修改内容的方法,所以字符串对象才无法修改。

12、StringBuffer 和 StringBuilder 哪一种类型的效率更高?两种类型分别适用于什么样的场合?

StringBuilder 的效率更高,因为 StringBuffer对方法加了同步锁,而 StringBuilder没有对方法加同步锁。虽然StringBuilder 的效率更高,但是因为没有对方法加同步锁,因此在多线程环境下不保证线程安全,只适合单线程环境,而 StringBuffer 可以用于多线程环境。

今日总结

今天和大家总结了在面向对象的考察点上一些常见的面试题,在这一篇中我们需要掌握初始化块的调用顺序this关键字的使用三种修饰符的作用范围以及字符串的三个常用操作类String、StringBuilder、StringBuffer

面向对象的面试题比较多,之后还会继续总结,如果小伙伴们有遇到其他相关的面试题,欢迎在评论区留言提出,==我会把大家提出的总结到文章内==, 欢迎小伙伴们一起评论区打卡学习!小伙伴们可也在左方加我好友一起探讨学习!

我是==灰小猿==,我们下期见!
请添加图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。