• 实例构造与结构构造(Java/C#)

    by{ guangboo }, published {2007-12-24}, Tag { CSharp / Java / }

    所谓实例构造就是指通常的构造函数带参数的和不带参数的,其中不带参数的构造函数又叫做默认构造函数。而类型构造函数又可称为静态构造函数。例如:

    public class Customer...{
          public Customer()...{ ... }   // instance constructor, default
          public Customer(Type type)...{ ... } //instance constructor with argument
          static Customer()...{ ... }   // type constructor
    }

    其中public Customer(),public Customer(Type type),为实例构造函数,static Customer为类型构造函数,当实例化一个这样的类的时候如:Customer customer = new Customer([Type type])时,CLR首先会调用类型构造函数,然后是实例构造函数。下面看个例子:

    public class Customer : Base ...{
         public Customer()...{
               System.Console.WriteLine("Customer instance constructor was invoked.");
          }
          static Customer()...{
                System.Console.WriteLine("Customer type constructor was invoked.");
          }
    }
    public class Base...{
          public Base()...{
               System.Console.WriteLine("Base instance constructor was invoked.");
          }
          static Base()...{
               System.Conole.WriteLine("Base type constructor was invoked.");
          }
    }
    

    到创建Customer对象时候,customer = new Customer();时候有如下输出:

    Customer type constructor was invoked.

    Base type constructor was invoked.

    Base instance was invoked.

    Customer instance was invoked.

    而在Java中却不一样,看下面的例子:

    package mf;
    public class Base ...{
        public Base()...{
            System.out.println("Base instance constructor was invoked.");
        }
        static...{
            System.out.println("Base type constructor was invoked.");
        }
    }
    public class Customer extends Base...{
        public Customer()...{
            System.out.println("Customer instance constructor was invoked.");
        }
        static...{
            System.out.println("Customer type constructor was invoked.");
        }
    }
    public class Test ...{
        public static void main(String[] args) ...{
            Customer customer = new Customer();
        }
    
    }
    

    其输出结果为:

    Base type constructor was invoked.
    Customer type constructor was invoked.
    Base instance constructor was invoked.
    Customer instance constructor was invoked.