Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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_Compiler Construction - Fatal编程技术网

Java 这两个程序之间的区别

Java 这两个程序之间的区别,java,compiler-construction,Java,Compiler Construction,假设有以下两个程序: public class Main { private static boolean test= false; public static void main(String[] args) { if(test) method1(); } private static void method1() { //Some stuff method2(); }

假设有以下两个程序:

public class Main {

    private static boolean test= false;

    public static void main(String[] args) {
        if(test)
            method1();
    }

    private static void method1() {
        //Some stuff
        method2();
    }

    private static void method2() {
        //Some stuff
    }

}


对于第二个问题,我想说编译器不会为
method1()
method2()
生成
bytecode
,因为
test
final
并设置为
false

它会为第一种情况生成字节码吗?如果是,为什么

编辑:

第一次的编译器输出:

public class Main extends java.lang.Object{
static{};
Code :
0: iconst_0
1: putstatic #10; //Field test:Z
4: return

public Main();
Code :
0: aload_0
1: invokespecial #15; //Method java/lang/Object."<init>":<>V
4: return

public static void main(java.lang.String[]);
Code :
0: getstatic #10; //Field test:Z
3: ifeq 9
6: invokestatic #21; //Method method1:()V
9: return
public类Main扩展java.lang.Object{
静态{};
代码:
0:iconst_0
1:putstatic#10;//现场测试:Z
4:返回
公用干管();
代码:
0:aload_0
1:invokespecial#15;//方法java/lang/Object。“”:V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:getstatic#10;//字段测试:Z
3:ifeq 9
6:invokestatic#21;//方法method1:()V
9:返回
第二次的编译器输出:

public class Main extends java.lang.Object{
public Main();
Code :
0: aload_0
1: invokespecial #12; //Method java/lang/Object."<init>":<>V
4: return

public static void main(java.lang.String[]);
Code :
0: return
public类Main扩展java.lang.Object{
公用干管();
代码:
0:aload_0
1:invokespecial#12;//方法java/lang/Object。“”:V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:返回

简单回答:当然,在两个示例中,它都会为这两个方法生成字节码。如果您快速编译这两个类,然后反编译这些类,您将看到所有内容都存在

但是,如果使用模糊器,则可能会有所不同


干杯!

在提问之前您尝试了什么?我看到的唯一区别是测试变量在第二秒是final。也许我的眼睛错过了其他一些区别。@CodeChimp-理论上,
静态final
变量可能被视为与C宏“开关”相同,并打开或关闭代码,甚至无法生成(虽然他们不会关闭语法检查)。但我从来没有真正深入研究过这个问题——在我看来这有点过分。Jon说的话——试试看,用
javap
打印字节码,看看这两个版本有什么不同。(我猜仍然会生成方法,只是会省略调用。)
public class Main extends java.lang.Object{
public Main();
Code :
0: aload_0
1: invokespecial #12; //Method java/lang/Object."<init>":<>V
4: return

public static void main(java.lang.String[]);
Code :
0: return