【问题标题】:Are static methods and variables available in derived classes?派生类中是否有静态方法和变量?
【发布时间】:2010-11-01 06:51:31
【问题描述】:

我在一个类中有静态变量和方法。它们会在派生类中被继承吗?

例如:

class A 
{
    public static int x;
    public static void m1()
    {
        some code
    } 
}
class B:A
{
    B b=new B();
    b.m1();  // will it be correct or not, or will I have to write 
             // new public voim1();      or      public void  m1();
    b.x=20;  // will it be correct or not?
}

【问题讨论】:

  • 你的代码很乱——特别是在B

标签: c# inheritance static-members


【解决方案1】:

静态成员将在派生类中可用,但您无法使用实例引用访问它们。您可以直接访问它们:

m1();
x = 20;

或使用类名:

A.m1();
A.x = 20;

【讨论】:

    【解决方案2】:

    静态成员将可用,但您将无法在实例上引用它们。而是使用类型进行引用。

    例如

    class B:A
    {
        public void Foo()
        {
            A.m1();
            A.x=20;
        }
    }
    

    【讨论】:

    • +1 用于发现 OP 从实例中引用它们的错误。
    • 我相信你可以从一个实例中引用它们(不是你应该);它只是发出警告,对吗?无论如何,Java 中就是这样。
    • 我们可以隐藏它们吗?如果我想隐藏它们,我需要为方法使用新的关键字吗?那么基类中的静态变量呢?我怎样才能将它隐藏在派生类中,我还需要为变量使用新关键字
    • 但我认为继承背后的概念是基类方法和变量可用于派生类,并且它们也可以使用派生类访问我不能像B.m1那样使用它吗( ); B.x=20; bcaus staic 方法和变量可用于派生类,所以现在我可以使用派生类名称和点来访问它
    • @NoviceToDotNet:确切的术语是“阴影”,您必须使用new 关键字来避免编译器警告。这适用于您想要影响的任何成员。
    【解决方案3】:

    静态成员可用,但您无法在实例上引用它们。因此,您必须使用超类的类前缀。 A.m1()

    这与可以使用实例引用访问静态方法和字段的 Java 语言形成鲜明对比。

    【讨论】:

      【解决方案4】:

      静态成员不与实例关联,因为它是类变量或类方法,您可以使用类名访问它。它通常用于保留一般类信息,例如创建的实例数等。

      【讨论】:

      • 我了解到静态变量是在编译时创建的 b4 执行单个命令,即在编译时为它们分配内存但是静态方法如何分配内存
      猜你喜欢
      • 2010-11-26
      • 2018-12-17
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 2021-11-24
      • 2012-06-25
      • 2013-01-10
      相关资源
      最近更新 更多