一道有意思的“初始化”面试题(1),2024-2024华为Java面试真题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

class Bowl {

Bowl(int marker) {

System.out.println(“Bowl(” + marker + “)”);

}

}

class Tableware {

static Bowl bowl7 = new Bowl(7);

static {

System.out.println(“Tableware静态代码块”);

}

Tableware() {

System.out.println(“Tableware构造方法”);

}

Bowl bowl6 = new Bowl(6);

}

class Table extends Tableware {

{

System.out.println(“Table非静态代码块_1”);

}

Bowl bowl5 = new Bowl(5); // 9

{

System.out.println(“Table非静态代码块_2”);

}

static Bowl bowl1 = new Bowl(1);

static {

System.out.println(“Table静态代码块”);

}

Table() {

System.out.println(“Table构造方法”);

}

static Bowl bowl2 = new Bowl(2);

}

class Cupboard extends Tableware {

Bowl bowl3 = new Bowl(3);

static Bowl bowl4 = new Bowl(4);

Cupboard() {

System.out.println(“Cupboard构造方法”);

}

void otherMethod(int marker) {

System.out.println(“otherMethod(” + marker + “)”);

}

static Bowl bowl5 = new Bowl(5);

}

public class StaticInitialization {

public static void main(String args[]) {

System.out.println(“main()”);

cupboard.otherMethod(1);

}

static Table table = new Table();

static Cupboard cupboard = new Cupboard();

}

涉及的知识点:

=======

  1. 在类的内部,变量定义的先后顺序决定了初始化顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造方法)被调用之前得到初始化。

  2. 无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象引用,那么它的默认初始化值就是null。

  3. 静态初始化只有在必要时刻才进行,例如:类里面的静态变量,只有当类被调用时才会初始化(执行),并且静态变量不会再次被初始化(执行),即静态变量只会初始化(执行)一次。

  4. 初始化的顺序是先静态对象,然后是非静态对象。

  5. 当有父类时,完整的初始化顺序为:父类静态变量(静态代码块)->子类静态变量(静态代码块)->父类非静态变量(非静态代码块)->父类构造器 ->子类非静态变量(非静态代码块)->子类构造器 。

  6. 即使没有显示的使用static关键字,构造器实际上也是静态方法。

下面是上面第5点提到的一些关键字的例子:

**静态变量(类变量):**static修饰的变量。

static Bowl bowl7 = new Bowl(7);

静态代码块**:**static修饰的代码块,可以放多个语句。看起来像个方法,实际上只是一段跟在static关键字后面的代码。

static {

System.out.println(“静态代码块”);

}

**非静态变量(实例变量):**普通变量,没有static修饰。

Bowl bowl6 = new Bowl(6);

**非静态代码块:**普通代码块,没有static修饰,可以放多个语句。

{

System.out.println(“非静态代码块”);

}

**构造方法(构造器):**跟类同名的方法,可以有多个,如果没有写构造方法,则会自动创建一个为空的构造器。

Tableware() {

System.out.println(“构造方法”);

}

看完这几个知识点,你能写出正确答案了吗,请自己动手试一试。

题目详解:

=====

  1. 首先我们找到“public class”,此时我们看到熟悉的main()方法,但是在main()方法之外有两行static的变量定义,根据上面的知识点1可知,变量的初始化会在任何方法之前,因此,先执行第49行代码的Table初始化。注意:如果此处Table的定义不是“static”修饰,则不会执行,因为在执行main()方法时,可以理解为执行了代码“StaticInitialization.main(null)”,要执行main()方法必须加载StaticInitialization类,所以静态域(table和cupboard)会得到初始化,而非静态域只有创建类的实例时才会得到初始化,例如执行了代码“StaticInitialization s = new StaticInitialization()”。

  2. 此时,我们来看Table类,发现Table有父类Tableware,根据上面的知识点5,可知会先初始化“父类静态变量(静态代码块)”,即第7、9行代码;接着是“子类静态变量(静态代码块)”,即第24、26、31行代码;接着执行“父类非静态变量(非静态代码块)”,即第14行代码;接着执行“父类构造器”,即第12行代码;接着执行“子类非静态变量(非静态代码块)”,即第18、20、22行代码;最后执行“子类构造器 ”,即第29行代码;至此,第49行代码,table的初始化结束。

  3. 接着,执行第50行代码Cupboard的初始化,过程跟Table类似。我们发现Cupboard也有父类,并且跟之前的Table一样是Tableware,此时我们要注意上面的知识点2/3,“静态变量只会初始化(执行)一次”,因此Tableware中的静态变量在此次Cupboard的初始化中不会再初始化。根据上面的知识点5,首先执行“父类静态变量(静态代码块)”,已经执行过,跳过;接着执行“子类静态变量(静态代码块)”,即第35、42行代码;接着执行“父类非静态变量(非静态代码块)”,即第14行代码;接着执行“父类构造器”,即第12行代码;接着执行“子类非静态变量(非静态代码块)”,即第34行代码;最后执行“子类构造器 ”,即第37行代码;至此,第50行代码,cupboard的初始化结束。

  4. 两个静态变量初始化完成后,接着执行main()方法,首先执行第46行代码,输出“main()”,接着执行47行代码,即第40行代码。至此,整个过程全部执行完毕。

答案:

===

下面是标注了执行顺序的代码。

class Bowl {

Bowl(int marker) {

System.out.println(“Bowl(” + marker + “)”);

}

}

class Tableware {

static Bowl bowl7 = new Bowl(7); // 1

static {

System.out.println(“Tableware静态代码块”); // 2

}

Tableware() {

System.out.println(“Tableware构造方法”); // 7、15

}

Bowl bowl6 = new Bowl(6); // 6、14

}

class Table extends Tableware {

{

System.out.println(“Table非静态代码块_1”); // 8

}

Bowl bowl5 = new Bowl(5); // 9

{

System.out.println(“Table非静态代码块_2”); // 10

}

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
93042051)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-tw4sQHSO-1713293042052)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-FDj7OpcO-1713293042052)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值