子类如果不实例化则不会调用它自身的静态构造函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 如果注释掉, 则Stat2.Instance为null 报错
            Stat1.DoSth();

            Stat2 st2 = new Stat2();
            #endregion

            Stat2.DoSth();

            Console.ReadKey();
        }
    }

    class Stat1
    {
        public static Stat1 Instance;
        //static Stat1()
        //{
        //    Console.WriteLine("Stat1 Static Structor");
        //}
        public static void DoSth()
        {
            Instance.Do();
        }

        static Stat1()
        {
            Console.WriteLine("Stat1 Static Costructor");
            Instance = new Stat1();
        }

        public virtual void Do()
        {
            Console.WriteLine("Stat1 Do");
        }
    }

    class Stat2 : Stat1
    {
        static Stat2()
        {
            Console.WriteLine("Stat2 Static Costructor");
            Instance = new Stat2();
        }

        public override void Do()
        {
            Console.WriteLine("Stat2 Do");
        }
    }
}

Stat1这个基类如果不实例化,直接使用它的静态方法,是先调用了它静态构造函数的。
但是Stat2这个子类如果不实例化,则既不会调用Stat1基类的构造函数,也不会调用Stat2它自己的静态构造函数。

这是不是很奇怪?

子类如果不实例化则不会调用它自身的静态构造函数,布布扣,bubuko.com

时间: 2024-10-01 07:43:31

子类如果不实例化则不会调用它自身的静态构造函数的相关文章

java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名.成员这个方式,因为静态成员是属于类的,并不是属于具体的对象 c#中     只能通过类名.成员调用,并不能 用实例来进行调用 2.c#的静态构造函数和java中的构造代码块.静态代码块 c# 静态构造函数的特点:        1)静态构造函数不需要手动调用,系统自动调用        2)静态构造

10. JavaSE-子类实例化过程 & 构造方法间调用

子类的实例化过程: 子类中所有的构造函数默认都会访问父类中空参数的构造函数. class Parent { Parent(){ System.out.println("parent class run"); } } class Children extends Parent { Children(){ //super();//调用的就是父类空参数的构造函数 System.out.println("children class run"); //return; /*说

Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在祝方法调用,后者必须先实例化后用实例调用)

1 package lsg.ap.april4th2; 2 /* 3 知识点:1.Getter and Setter 的应用 4 2.局部变量与成员变量(也可叫做全局变量) 5 3.Static关键字的用法 6 a.成员变量被static修饰后的所有类的共享属性 7 b.方法被static修饰之后,在本类内调用的类名省略问题;以及不用Static,即使在本类内也必须先实例化 8 4.This关键字的用法 9 this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 10 11 注意:谁

波哥学JAVA,定义类 创建对象 实例化对象 属性 类调用属性或者方法

定义类 声明对象  创建对象 实例化对象 属性 对象调用属性或者方法 举例,下面定义类了一个类并声明属性,写了一个方法: 创建对象 实例化对象 属性 类调用属性或者方法

静态构造函数, 静态成员初始化/调用顺序

1)第一次调用类的任何成员之前,执行静态成员的初始化动作,执行顺序是:静态成员初始化--->静态构造函数--->调用类的某成员(构造器,静态字段/属性/函数,) 2)静态成员在第一次被访问之前并且在调用静态构造函数(如有存在)之前进行初始化.同1). 3)在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数.调用静态构造函数之前会先做静态成员的初始化.同1),2). 4)如果类包含静态字段,请提供在加载类时初始化这些字段的静态构造函数. 5)在应用程序域的生存期内,静态类一直保留在内

c# 静态构造函数与构造函数的调用先后

先上代码: 测试类: /// <summary> /// 构造函数 /// </summary> public RedisHelper() { Console.WriteLine("构造方法"); } static RedisHelper() { Console.WriteLine("静态构造方法"); } public static void Test() { Console.WriteLine("Test方法"); }

【C#基础】 可选参数调用、params、无参静态构造函数

C# 可选参数方法调用: 可选参数方法: 调用方式可以: 这样我们要是用age和grade的默认值这样我们就可以跳过不必要的 我们就可以指定year的值. 可选参数必须在所有必须参数之后 params可变参数一定要在最后一个 静态构造函数 没有修饰符 C#的新特征是可以给类写一个无参静态的构造函数,这种构造函数只执行一次. 编写静态构造函数的原因是,有一些静态的字段或属性在第一次使用类之前从外部初始化静态字段和属性. 无参构造函数和静态构造函数可以存在同一个类中. 如果是只读成员,他就是一个不可

子类对象的实例化过程

-----------siwuxie095 在子类对象实例化之前,必须先调用父类中的构造方法,之后调用子类构造方法 代码: package com.siwuxie095.extendsdemo; class Father{ private String name; private int age; public Father() { System.out.println("父类的构造方法"); } } class Son extends Father{ public Son() { S

JAVA基础-子类继承父类实例化对象过程

之前在项目中碰到这样一个问题: 类B继承了类A,B在实例化的时候,A的构造方法中调用了B的某个方法,并且B的方法中对B的成员属性进行了初始化,然后最后得到的B对象的成员属性为空. 代码场景如下: 这里B new出来后s会被“s = null”覆盖A中调用init的值,A中调用的方法若被子类覆盖,那么构造过程中虽然是先构造A对象,但是A对像调用的方法却是子对象的方法,然后调用B的代码块,构造方法. 这里为了不然S=null覆盖原来的初始化值,我们可以去掉代码块中s的初始化过程. 我们来详细分析下子