java面向对象值类属语句块
在我们之前学习语句的时候,我们讲过一种比较特殊的语句块,那就是局部代码块。局部代码块的作用是什么呢,就是把临时使用的变量放在里面,之后执行完之后,局部代码块中定义的变量会直接被释放,这样就避免了那些我们只用一次的变量的释放。那么类当中有么有一种比较特殊的代码块么?肯定是有的,我们现在就来看下,在类方法外部定义的类的代码块都有什么作用?
代码实例:
class ClassScop { int num; String name; /** *类内部的代码块开始 */ { System.out.println("Hello World!"); } ClassScop(int num,String name) { this.num = num; this.name = name; } static void sayLoud() { System.out.println("Say Loudly"); } } class ScopDemo { public static void main(String[] args) { //初始化对象 ClassScop cs1 = new ClassScop(10,"Hello cs1"); ClassScop cs2 = new ClassScop(9,"Hello cs2"); } }
这个地方,当我们new两个对象的时候,我们会发现此时类内部的代码块被调用了两次,那么调用这个类内部的代码块到底跟谁有关系呢?这个我们是不是还不清楚呢?到底是跟类有关系还是跟类的对象有关系,为了验证以上我们的推测哪个是正确的,这里我们来写个代码验证下:
class ScopDemo { public static void main(String[] args) { //初始化对象 //ClassScop cs1 = new ClassScop(10,"Hello cs1"); //ClassScop cs2 = new ClassScop(9,"Hello cs2"); //因为静态变量是先于对象而存在的,如果这个跟对象有关系,此时结果就不会出现,反之则出现 ClassScop.sayLoud(); } }
当编译运行这段代码之后,我们没有得到 hello world,所以说这个过程跟对象的构造有关系,也就是说这里说的类内方法之外的代码块,称他为构造代码块,更贴切一些。
那么我们再来思考一个问题,静态代码块--构造代码块--构造函数--局部代码块 这四个代码块产生的顺序是怎样的呢?
下面我们用一个完整的示例来猜测下:
class ClassScop { int num; String name; { System.out.println("Hello Construct Scop!"); } ClassScop(int num,String name) { this.num = num; this.name = name; System.out.println("Hello ClassScop"); } static void sayLoud() { System.out.println("Hello Static"); } void sayJuBu() { { System.out.println("Hello Jubu"); } } } class ScopDemo { public static void main(String[] args) { ClassScop.sayLoud(); ClassScop s1 = new ClassScop(10,"ddd"); } }
这个就是编译之后生成的结果,初始化顺序是:静态第一、构造代码块第二、构造函数第三、局部代码块第四(很多变,分在静态还有在动态方法中论述)。
以上就是对构造代码块的讲述,构造代码块的用途,待续....