C# 类初始化顺序

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("子类 构造函数"); 
        } 
  
    } 
 
    /// <summary> 
    /// 用于显示的类 
    /// </summary> 
    class Display 
    { 
        public Display(string str) 
        { 
            Console.WriteLine(str); 
        } 
    } 
 
    class programe 
    { 
        static void Main(string[] args) 
        { 
            B b = new B(); 
 
        } 
    } 
} 
  1. 子类静态变量 
  2. 子类静态readonly常量 
  3. 子类变量 
  4. 子类readonly常量 
  5. 基类静态变量 
  6. 基类静态readonly常量 
  7. 基类变量 
  8. 基类 readonly常量 
  9. 基类 构造函数 
  10. 子类 构造函数 

而对于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(); 
    } 
 
} 

  

结果如下:

  1. 基类静态变量 
  2. 基类静态final常量 
  3. 子类静态变量 
  4. 子类静态final常量 
  5. 基类变量 
  6. 基类 final常量 
  7. 基类 构造函数 
  8. 子类变量 
  9. 子类final常量 
  10. 子类 构造函数 
原文地址:https://www.cnblogs.com/x-poior/p/5028374.html