前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java核心面试宝典】Day7、面向对象常见面试题汇总(二)

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

作者头像
灰小猿
发布2021-09-23 15:18:02
1890
发布2021-09-23 15:18:02
举报
文章被收录于专栏:灰小猿技术社区

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 的实例。

代码语言:javascript
复制
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

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

我是灰小猿,我们下期见!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、静态初始化块和非静态初始化块的执行顺序是什么?以及分别会执行多少次?
  • 2、静态初始化块和main方法哪个先执行?
  • 3、存在继承关系的初始化块的执行顺序是怎样的?
    • 追问:如果不止两个类的继承呢?应该按照什么顺序执行?
    • 4、关键字this的含义是什么?
    • 5、关键字this在方法中以及在构造方法中分别表示什么?
    • 6、关键字this是否可以在静态方法中使用?说明理由!
    • 7、如果类成员不加任何修饰符,可以从哪里访问到该类成员?
    • 8、可见性修饰符public和private分别表示可以从哪里访问类成员?
    • 9、什么是数据域封装?为什么要使用数据域封装?
    • 10、在使用数据域之后,应如何读取和修改数据域的值?
    • 11、String类型的值是否可变?对String类型的值进行修改操作是否修改了String的内容?
    • 12、StringBuffer 和 StringBuilder 哪一种类型的效率更高?两种类型分别适用于什么样的场合?
    • 今日总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档