我们试想一下现在有一个类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# 类中的静态字段始终继承自基类的更多相关文章

  1. spring 项目中在类中注入静态字段

    有时spring 项目中需要将配置文件的属性注入到类的静态字段中 例如:文件上传 //文件上传指定上传位置 //resource-dev.properties 有如下参数 #upload UPLOAD ...

  2. java中使用静态字段和构造函数跟踪某个类所创建对象的个数

    对于这个问题,我们都知道java中使用类时会自动调用构造函数.按照这个思路我们可以定义一个static int 形的常量count 然后将count++放入这个类的构造函数中,这样只要输出count的 ...

  3. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  4. C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}

    C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...

  5. C++ | 继承(基类,父类,超类),(派生类,子类)

    转载:https://blog.csdn.net/Sherlock_Homles/article/details/82927515 文章参考:https://blog.csdn.net/war1111 ...

  6. 使用虚幻引擎中的C++导论(二-UE4基类)

    使用虚幻引擎中的C++导论(二) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...

  7. C++//菱形继承 //俩个派生类继承同一个基类 //又有某个类同时继承俩个派生类 //成为 菱形继承 或者 钻石 继承//+解决

    1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...

  8. File类里的静态字段

    我们都知道windows操作系统和Linux操作系统中的路径分隔符是不一样的,当我们直接使用绝对路径的时候,程序会报错误:No such file or diretory”的异常 File类有几个类似 ...

  9. PHP 访问类中的静态属性

    静态属性和普通属性不一样,静态属性只属于类本身而不属于类的任何实例,所以他们的访问方式也不一样.你可以把静态属性认为是存储在类当中的全局变量,而且你可以在任何地方通过类来访问它们. 在类本身中访问静态 ...

随机推荐

  1. 简述Spring及配置

    简述Spring及配置 Spring最主要的思想就是IoC(Inversionof Control,控制反转),或者成为DI(Dependency Injection,依赖注入) 一.springMV ...

  2. MyBaits_查询缓存02_Ehcache二级缓存

    一.Ehcache二级缓存的开启 导入jar(https://github.com/mybatis/ehcache-cache/releases) <cache type="org.m ...

  3. Spring Data JPA 缓存结合Ehcache介绍

    一级缓存: 会话session.事务级别的,事务退出,缓存就失效了. 实体管理器在事务执行期间持有一份数据的拷贝,而非直接操作数据源. 二级缓存: 进程范围级或集群范围的缓存,这个级别的缓存可配置和修 ...

  4. linux cut: invalid byte, character or field list Try 'cut --help' for more information.

    1. 概述 centos执行简单shell 脚本 报错 cut: invalid byte, character or field listTry 'cut --help' for more info ...

  5. 2D平面中关于矩阵(Matrix)跟图形变换的讲解

    在二维平面上,常用的有以下三种基本的图形变化: 1)Translation 2)Scale 3)Rotation 在canvas的开发中,我们也经常会用到这样的一些图形变换,尤其是我们在写自定义Vie ...

  6. VS code 自定义快捷输入

    本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 位置 ctrl+shift+p 搜索: snippets 输入类型: 比如 ...

  7. EF单实对应多表

    一.单实体对应多表 适用场景主表,拥有相同主键附属表或扩展表. 1. 建表词句 CREATE TABLE [Chapter2].[Product]( [SKU] [int] primary key , ...

  8. 常见的浏览器兼容性问题与解决方案——CSS篇

    1.不同的浏览器的标签默认的外补丁和内补丁不同 问题症状:随便写几个标签,不加样式控制的情况下,各自的margin和padding差异较大. 碰到频率:100% 解决方案:初始化CSS的默认样式,*{ ...

  9. Netty入门4之----如何实现长连接

    ​ 前面三章介绍了Netty的一些基本用法,这一章介绍怎么使用Netty来实现一个简单的长连接demo. 关于长连接的背景知识,可以参考<如何使用Socket实现长连接> ​ 一个简单的长 ...

  10. python 测试:生成exe文件

    任务: test.py print(input('请输入:')) 将test.py生成test.exe 解答: 安装: pip install pyinstaller 命令使用: (绝对地址)pyin ...