编译器读取后仍然运行的方法

时间:2016-02-26 14:56:00

标签: java

嗨,根据我的教程,我尝试了一项有趣的练习(至少对我而言)。

我的主要课程如下所示

 public class Main {

    public static void main (String[]args){       
        Link link = new Link();
        link.interfaceListener(new LinkerInterface(){
            @Override        
            public void showNumber(int numb) {
                System.out.println(numb);
            }
        });   

        link.calc();
    }
}

我的链接类如下所示

import java.util.Scanner;

public class Link {
    private boolean trueFalse;    
    private LinkerInterface interface1;    
    int numb;

    public Link() {    
        Scanner scanner = new Scanner(System.in);    
        numb = scanner.nextInt();
        scanner.close();
        try {    
            Thread.sleep(5000);    
        } catch (InterruptedException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
        }

        if (numb == 1) {    
            trueFalse = true;    
        }
        else if (numb == 0) {    
            trueFalse = false;    
        }
    }


    public void interfaceListener(LinkerInterface interface1) {    
        this.interface1 = interface1;    
    }


    public void calc() {    
        if (numb == 0) {    
            interface1.showNumber(0);    
        } else if (numb == 1) {    
            interface1.showNumber(1);    
        }    
      }
    }

我唯一的界面如下

public interface LinkerInterface {
    public void showNumber(int numb);
}

我把int thread.sleep只是为了给我足够的时间在触发link.calc()之前计算输入到扫描器。

我的问题是,基本上当我输入1例如扫描器时,编译器已经读过

link.interfaceListener(new LinkerInterface(){   
            @Override    
            public void showNumber(int numb) {    
                System.out.println(numb);
            }
        });

在我的主要方法中。那么当启动link.calc()时,如何回调上面的代码呢?为什么编译器会回来读它呢?当它意识到我在Link类中的calc方法指向interface1.showNumber(0)时,它不应该给出一些非指针异常或类似的东西。实际上什么都没有执行?是什么让它参考我的主要方法?

1 个答案:

答案 0 :(得分:1)

执行顺序如下:

  1. 您创建了一个新的Link对象
  2. 调用Link构造函数内的
  3. 代码,用户输入数字,线程休眠等。
  4. 您创建了一个实施LinkerInterface方法的新showNumber实例,但未被调用
  5. 您调用link.calc();方法,后者又调用interface1.showNumber(...)方法
  6. 如果您在致电LinkerInterface之后设置calc ,则会获得NullPointerException(即切换步骤3和4) )。

      

    我把int thread.sleep只是为了给我足够的时间来计算输入   在触发link.calc()之前进入扫描程序。

    不正确,scanner 等待用户输入。 sleep在这里没用,它总是会睡5秒,无论用户输入数字需要多长时间......

    哦是的,编译器没有执行您的代码。 JVM呢。编译器只是将您的Java代码转换为JVM使用的字节代码。