PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 这是个非常非常好的问题。自己好好想,想不通就问,必须给你这种学习态度点个大大的赞👍 为什么视频中没讲,是因为涉及到了class加载和初始化的过程,对于入门级的内容来说,可能有点不好理解。毕竟这部分内容抽象而又不是“特别有用” 说回问题本身。这是一个类加载和初始化的问题,也是Java一切都是类和对象的体现。不管是main方法还是别的静态方法,都必须在类初始化完毕后才能执行。这个原因也很简单,因为main方法中能使用别的静态变量。那为什么要等静态代码块执行呢,因为静态代码块就是初始化静态变量的。所以main方法虽然是程序入口,却不是程序执行的第一行Java代码。
作者回复: 除0报错是Java中的设计。这么想,9/0应该返回什么呢?无限大或者出错。对于整数的除0问题,Java选择报错。
作者回复: Q:“那么静态变量应该也是在使用类之前就会被初始化好吧?” A:是。 Q:“相应的我们在一个类中写静态方法是不是也会在使用类之前就被初始化好呢?” A:静态方法没有初始化这个概念。静态方法也好,非静态方法也好,就是一段程序代码,没有数据,不需要初始化。如果说方法有“准备好”这么一个过程,那么类加载的时候就“准备好”了。
作者回复: 你可以认为静态变量的赋值也是放在静态代码块里的,就好像你可以认为成员变量的赋值都是在构造方法里一样。 有些静态变量的赋值比较麻烦,最典型的就是可能需要几步运算,或者需要try catch异常。这时候就必须祭出静态代码块了。
作者回复: 这个课程里有提到,它的作用就是初始化静态变量。 多才多艺的程序员们也发现用这种机制可以实现lazy init的单例模式。这个后面也有例子讲解。
作者回复: 静态变量和静态初始化代码块(就是static {xxx},可以有多个)是按照从上到下的顺序执行的。这就是类初始化的顺序。剩下的是new 对象的时候,先初始化成员变量,然后执行构造方法。
作者回复: 是的,有实际的使用场景会更让人知道怎么用。使用场景的准备、搭建、理解都比较复杂。所以这里尽量使用一个偏学习的场景去引出一个个语法点
作者回复: ✅
作者回复: 可以 对,变量怎么操作还是个技术活,别人封装成方法使用更方便。
作者回复: 可以算,但是main方法不仅仅是静态代码块。