C#的类初始化顺序和Java以及C++类初始化顺序是不同的,曾经我被这个问题害惨了。
对于C#和Java,其共同点都是先变量后构造函数,先静态后普通 区别在于,C#是子类变量->父类变量->父类构造函数->子类构造函数,才轮到构造函数,但是Java的是父类变量->父类构造函数->子类变量->子类构造函数.using System; namespace Test { public class A { private static Display d1 = new Display("基类静态变量"); private Display d2 = new Display("基类变量"); private static readonly Display d3 = new Display("基类静态readonly常量"); private readonly Display d4 = new Display("基类 readonly常量"); public A() { Console.WriteLine("基类 构造函数"); } } class B : A { private static Display d1 = new Display("子类静态变量"); private Display d2 = new Display("子类变量"); private static readonly Display d3 = new Display("子类静态readonly常量"); private readonly Display d4 = new Display("子类readonly常量"); public B() { Console.WriteLine("子类 构造函数"); } } ////// 用于显示的类 /// class Display { public Display(string str) { Console.WriteLine(str); } } class programe { static void Main(string[] args) { B b = new B(); } } }
- 子类静态变量
- 子类静态readonly常量
- 子类变量
- 子类readonly常量
- 基类静态变量
- 基类静态readonly常量
- 基类变量
- 基类 readonly常量
- 基类 构造函数
- 子类 构造函数
而对于java呢,源码如下:
package com.vision.paintTest; class A { private static Display d1 = new Display("基类静态变量"); private Display d2 = new Display("基类变量"); private static final Display d3 = new Display("基类静态final常量"); private final Display d4 = new Display("基类 final常量"); public A() { System.out.println("基类 构造函数"); } } class B extends A { private static Display d1 = new Display("子类静态变量"); private Display d2 = new Display("子类变量"); private static final Display d3 = new Display("子类静态final常量"); private final Display d4 = new Display("子类final常量"); public B() { System.out.println("子类 构造函数"); } } class Display { public Display(String str) { System.out.println(str); } } public class Mytest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub B b = new B(); } }
结果如下:
- 基类静态变量
- 基类静态final常量
- 子类静态变量
- 子类静态final常量
- 基类变量
- 基类 final常量
- 基类 构造函数
- 子类变量
- 子类final常量
- 子类 构造函数