Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在java中,接口中的静态最终变量可以被本地变量覆盖?_Java_Interface_Static_Final - Fatal编程技术网

为什么在java中,接口中的静态最终变量可以被本地变量覆盖?

为什么在java中,接口中的静态最终变量可以被本地变量覆盖?,java,interface,static,final,Java,Interface,Static,Final,我知道静态的意思,在内存中只有一个实例。 我知道final意味着它不能被更改或子类化,我还知道java接口中定义的任何变量都是静态final 现在的问题是,为什么我可以在XFace类的接口MyFace中覆盖最终的静态变量a 例如: public interface MyFace { static final int a = 15; void smile(); } 然后在课堂上,我可以轻松超越a,与当地的a public class XFace implements MyFac

我知道静态的意思,在内存中只有一个实例。 我知道final意味着它不能被更改或子类化,我还知道java接口中定义的任何变量都是静态final

现在的问题是,为什么我可以在XFace类的接口MyFace中覆盖最终的静态变量a

例如:

public interface MyFace {
    static final int a = 15;

    void smile();
}
然后在课堂上,我可以轻松超越a,与当地的a

public class XFace implements MyFace {

    @Override
    public void smile() {
        int a=3;  // over riding interface's a variable and suprsingly it works !
        System.out.println(a*2);  // will print 6
    }

为什么我可以在smile方法中定义int a=3?这不是最终的和静态的吗?它怎么可能被重写呢?

它没有被重写,它被隐藏了,这意味着有一个更接近的变量具有相同的简单名称,具有优先权。通过使用较长的名称MyFace.a,您仍然可以使用静态final。

只需查看有局部变量a和没有局部变量a的两种不同用法的字节码。正如您可能看到的,如果只定义了静态,编译器将直接使用30 3:bipush 30 如果定义了局部变量a,则按下局部变量1 local1,然后执行乘法运算

   5:   iload_1
       6:   iconst_2
       7:   imul
如果要同时使用这两个变量,必须在定义静态变量的地方使用类名

System.out.println(a*2);  // will print 6
System.out.println(MyFace.a); //will print 15
下面是定义局部变量a的示例代码

下面是定义静态变量a的示例代码


要从编译的类文件中打印字节码,请使用$JDK_HOME/bin下的javap工具sense@Bohemian我后退了,因为MyFace.a不是FQ,除非它是无包装的。我不知道班级限定名的官方术语是什么,我今晚也不想参加JLS考古。用班级限定名来限定它将是fit.np,但“更长”这个词并不合适。也许只是限定而不是完全限定这不仅仅适用于继承。您可以使用本地变量来隐藏类的实例变量或静态变量,就像您在这里所做的那样。这不是推荐的做法。谢谢,我怎样才能看到你在这里写的符合的装配代码?
public class XFace implements MyFace {

    @Override
    public void smile() {
        int a=3; 
        System.out.println(a*2);  // will print 6

    }
}

Compiled from "XFace.java"
public class XFace extends java.lang.Object implements MyFace{
public XFace();
  Code:
   0:   aload_0
   1:   invokespecial   #10; //Method java/lang/Object."<init>":()V
   4:   return

public void smile();
  Code:
   0:   iconst_3
   1:   istore_1
   2:   getstatic       #17; //Field java/lang/System.out:Ljava/io/PrintStream;
   5:   iload_1
   6:   iconst_2
   7:   imul
   8:   invokevirtual   #23; //Method java/io/PrintStream.println:(I)V
   11:  return


}


*********************************************
public class XFace implements MyFace {

    @Override
    public void smile() {
        //int a=3; 
        System.out.println(a*2);  // will print 30

    }
}

Compiled from "XFace.java"
public class XFace extends java.lang.Object implements MyFace{
public XFace();
  Code:
   0:   aload_0
   1:   invokespecial   #10; //Method java/lang/Object."<init>":()V
   4:   return

public void smile();
  Code:
   0:   getstatic       #17; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   bipush  30
   5:   invokevirtual   #23; //Method java/io/PrintStream.println:(I)V
   8:   return

}