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();
- }
- }
- }
- 子类静态变量
- 子类静态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常量
- 子类 构造函数