C# 类中的静态字段始终继承自基类
我们试想一下现在有一个类Parent,它有一个static的int类型字段number,然后如果类Parent有三个子类Child01、Child02和Child03,那么改变Parent.number的值的话,Child01.number、Child02.number和Child03.number的值也会被更改吗?
新建一个.NET Core的控制台项目,我么来看看如下代码:
using System; namespace ConsoleApp
{
/// <summary>
/// 父类
/// </summary>
class Parent
{
public static int number = ;
} /// <summary>
/// Child01继承父类Parent
/// </summary>
class Child01 : Parent
{ } /// <summary>
/// Child02继承父类Parent
/// </summary>
class Child02 : Parent
{ } /// <summary>
/// Child03继承父类Parent
/// </summary>
class Child03 : Parent
{ } class Program
{
static void Main(string[] args)
{
Parent.number = ;
Child01.number = ;
Child02.number = ;
Child03.number = ; Console.WriteLine("Parent.number:" + Parent.number.ToString());
Console.WriteLine("Child01.number:" + Child01.number.ToString());
Console.WriteLine("Child02.number:" + Child02.number.ToString());
Console.WriteLine("Child03.number:" + Child03.number.ToString()); Console.WriteLine("Press any key to quit...");
Console.ReadKey();
}
}
}
结果如下:

很明显类Parent、Child01、Child02、Child03的number变量实际上都是指向的内存中栈(stack)的相同地址,也就是说类Child01、Child02和Child03在继承Parent类后,并不是在内存中新建了三个变量Child01.number、Child02.number和Child03.number,而是使用的同一个Parent.number变量。
然后现在我们将代码改成如下:
using System; namespace ConsoleApp
{
/// <summary>
/// 父类
/// </summary>
class Parent
{
public static int number = ;
} /// <summary>
/// Child01继承父类Parent,并定义自己的number变量,隐藏父类Parent的number变量
/// </summary>
class Child01 : Parent
{
public static new int number = ;
} /// <summary>
/// Child02继承父类Parent,并定义自己的number变量,隐藏父类Parent的number变量
/// </summary>
class Child02 : Parent
{
public static new int number = ;
} /// <summary>
/// Child03继承父类Parent,并定义自己的number变量,隐藏父类Parent的number变量
/// </summary>
class Child03 : Parent
{
public static new int number = ;
} class Program
{
static void Main(string[] args)
{
Parent.number = ;
Child01.number = ;
Child02.number = ;
Child03.number = ; Console.WriteLine("Parent.number:" + Parent.number.ToString());
Console.WriteLine("Child01.number:" + Child01.number.ToString());
Console.WriteLine("Child02.number:" + Child02.number.ToString());
Console.WriteLine("Child03.number:" + Child03.number.ToString()); Console.WriteLine("Press any key to quit...");
Console.ReadKey();
}
}
}
现在我们在子类Child01、Child02和Child03中分别定义了自己的number变量,并用关键字new隐藏了父类Parent的number变量,我们来看看现在运行的结果:

很明显,由于子类Child01、Child02和Child03中都有了各自的number变量,现在相当于这三个子类在内存中新建了三个变量Child01.number、Child02.number和Child03.number,所以现在每个类中number变量都拥有了不同的值。
所以请记住C#类中子类继承父类后,其和父类使用的是相同的静态字段,子类并不会和父类在内存中使用不同的静态字段。
C# 类中的静态字段始终继承自基类的更多相关文章
- spring 项目中在类中注入静态字段
有时spring 项目中需要将配置文件的属性注入到类的静态字段中 例如:文件上传 //文件上传指定上传位置 //resource-dev.properties 有如下参数 #upload UPLOAD ...
- java中使用静态字段和构造函数跟踪某个类所创建对象的个数
对于这个问题,我们都知道java中使用类时会自动调用构造函数.按照这个思路我们可以定义一个static int 形的常量count 然后将count++放入这个类的构造函数中,这样只要输出count的 ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...
- C++ | 继承(基类,父类,超类),(派生类,子类)
转载:https://blog.csdn.net/Sherlock_Homles/article/details/82927515 文章参考:https://blog.csdn.net/war1111 ...
- 使用虚幻引擎中的C++导论(二-UE4基类)
使用虚幻引擎中的C++导论(二) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...
- C++//菱形继承 //俩个派生类继承同一个基类 //又有某个类同时继承俩个派生类 //成为 菱形继承 或者 钻石 继承//+解决
1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...
- File类里的静态字段
我们都知道windows操作系统和Linux操作系统中的路径分隔符是不一样的,当我们直接使用绝对路径的时候,程序会报错误:No such file or diretory”的异常 File类有几个类似 ...
- PHP 访问类中的静态属性
静态属性和普通属性不一样,静态属性只属于类本身而不属于类的任何实例,所以他们的访问方式也不一样.你可以把静态属性认为是存储在类当中的全局变量,而且你可以在任何地方通过类来访问它们. 在类本身中访问静态 ...
随机推荐
- Spring和Hibernate结合的一个小例子
1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...
- 01HTMl-<base>标签
一.base用于定义页面链接的打开方式 <base target="_blank"/> 定义页面链接默认打开方式,base通过target属性告诉浏览器如何打开页面. ...
- Linux下mongodb
Linux下mongodb安装: 新建mongodb文件夹 下载安装包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3. ...
- 关于moucedown 的3种触发方式
与 click 事件不同 mousedown 按下鼠标就可以触发 click 只能用鼠标左键触发, 而mousedown 可以由单击.中键.或右击 触发 根据对event.which 的判断,可以 ...
- ArcGIS软件操作——地图配准
初次写博文,出现措词不当.表述不明确等之类的问题,敬请见谅,但会努力做好.同时,也欢迎各位提出意见,共同交流,共同进步! 直奔主题——运用ArcGIS软件对地图进行配准! 1 数据准备:网络下载的中国 ...
- linux 获取当前程序路径
const std::string strCfgName = "logger_import_db.conf" ;bool fGetCfgFileName(std::string&a ...
- Linux 下载百度网盘大文件
Linux 下没有百度网盘客户端,用浏览器下载速度慢得急死人 鼠标移到链接处, 右键, 然后复制链接 接着在终端里输入 axel -n 50 -o filename.ext “粘贴链接到此处” axe ...
- update_dctcp_alpha
/* + * Update dctcp alpha based on the ecn bit in the received packet. + * This procedure is called ...
- 对sql作业的总结(不用group by 通过with as,exists实现分类)
一次数据库作业 题目如下: Consider the following SQL table definitions: CREATE TABLE OlympicEvent ( Name text, Y ...
- 【转】Java中的String,StringBuilder,StringBuffer三者的区别
https://www.cnblogs.com/su-feng/p/6659064.html 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及String ...