黑马程序员 java_构造函数,构造代码块,静态构造代码块

 

                         ------- android培训java培训、期待与您交流! ----------

 

                       

1. Java 构造函数

 

            构造函数是一种特殊的方法,对象一建立就会调用与之对应的构造函数。
            构造函数的作用:可以用于给对象进行初始化。
            构造函数可以重载,这样就可以以多种方式创建对象,列如:

         

 class Person { private String name; private int age; Person(String name){ this.name=name; } Person(int age){ this.age=age; } }

 

 在创建Person类的对象时,可以根据需要选择其中一个构造函数,如new Person(“Lisi”)或者

new Person(20);另外如果在类中没有定义任何构造函数,还可以使用new Person()创建一个

对象,此时采用的构造方法Person()是一个默认构造函数,这个构造函数是系统默认给该类

的,只有当类中没有定义构造函数式才会有默认构造函数。

 

 

 构造函数与一般函数的不同:

a. 在写法上与一般函数在写法上不同,构造函数的名称与类名相同,并且没有返回值。
b. 在功能上也不同,构造函数在对象建立时,就给对象初始化。而一般方法只有在调用
    时才执行,给对象添加功能。
c. 一个对象建立,构造函数只运行一次,而一般方法可以被多次调用。
 

 

 

2. 构造代码块

 

    作用:给对象进行初始化。对象一建立就运行,而且优先于构造函

    和构造函数的区别:
          构造代码块是给所有对象进行统一初始化,
          而构造函数是给对应的对象初始化。

        

     从上面可以看出,当new Students("Lisi")时,首先执行的是构造代码块{...}中的代码,然后
才执行的是Students(String name){...}中的代码。同理,当new Students(30)时,首先执行的是 构造代码块{...}中的代码,然后才执行的是Students(int age){...}中的代码。

 

 

可见当new Students()时,先运行的是构造代码块中的内容,然后才是Students(){...}构造函数。

 

    如果age在类中已经显示初始化,情况又不一样。

 

      可见,当new Students()时,首先执行的是显示初始化,然后是构造代码块,

最后才是构造函数。

 

 

3.静态构造代码块

   

       格式为:  

static { 静态代码块中的执行语句。 }

       特点:随着类的加载而执行,只执行一次,并优先于主函数。用于给类进行初始化的。

 

 

4. 分析:当创建一个对象是时,各个部分的执行顺序

 

class Person { private Person(){} private String name = "hah"; private int age; private static String country = "cn"; Person(String name,int age) { this.name = name; this.age = age; } { System.out.println(name+".."+age); } public void setName(String name) { this.name = name; } public void speak() { System.out.println(this.name+"..."+this.age); } public static void showCountry() { System.out.println("country="+Person.country); Person.method(); } public static void method() { System.out.println("method run"); } } class PersonDemo { public static void main(String[] args) { Person p = new Person("zhangsan",20); p.setName("lisi"); new Person(); } }

 

     Person p = new Person("zhangsan",20);

     该句话都做了什么事情?

          a,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
          b,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
          c,在堆内存中开辟空间,分配内存地址。
          d,在堆内存中建立对象的特有属性。并进行默认初始化。
          e,对属性进行显示初始化。
          f,对对象进行构造代码块初始化。
          g,对对象进行对应的构造函数初始化。
          h,将内存地址付给栈内存中的p变量。  
   

                            ------- android培训java培训、期待与您交流! ----------