【问题标题】:Overriding interface's variable?覆盖接口的变量?
【发布时间】:2012-01-11 04:27:30
【问题描述】:

我从各种 Java 书籍和教程中读到,在接口中声明的变量是常量,不能被覆盖。

我做了一个简单的代码来测试它

interface A_INTERFACE
{ 
    int var=100; 
}

class A_CLASS implements A_INTERFACE
{ 
    int var=99; 
    //test
    void printx()
    {
        System.out.println("var = " + var);
    }
}

class hello
{

    public static void main(String[] args)
    {
        new A_CLASS().printx();
    }
}

然后打印出来 变量 = 99

var 是否被覆盖?我完全糊涂了。感谢您的任何建议!


非常感谢大家!我对这个界面很陌生。 “影子”是理解这一点的关键词。我查了相关资料,现在就明白了。

【问题讨论】:

  • 你没有“覆盖”一个变量,只有一个方法。

标签: java variables interface overriding


【解决方案1】:

它没有被覆盖,而是被遮蔽,由于接口中的常量也是静态的,因此会产生额外的混乱。

试试这个:

A_INTERFACE o = new A_CLASS();
System.out.println(o.var);

您应该收到有关以非静态方式访问静态字段的编译时警告。

现在这个

A_CLASS o = new A_CLASS();
System.out.println(o.var);
System.out.println(A_INTERFACE.var);  // bad name, btw since it is const

【讨论】:

    【解决方案2】:

    您没有覆盖该变量,而是使用在更具体的范围内声明的全新实例变量隐藏它。这是在您的 printx 方法中打印的变量。

    【讨论】:

      【解决方案3】:

      接口中任何变量的默认签名是

      public static final ...
      

      所以你无论如何都不能覆盖它。

      【讨论】:

        【解决方案4】:

        您在该接口中声明的变量对实现它的类不可见。

        如果您在 static 和 final 中声明一个变量,即一个常量,那么它对实现者是可见的。

        【讨论】:

        • 它是staticfinalpublic(由于在interface 中)
        猜你喜欢
        • 1970-01-01
        • 2012-11-10
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        • 2015-01-14
        • 2018-09-27
        • 2017-02-25
        相关资源
        最近更新 更多