嗨,根据我的教程,我尝试了一项有趣的练习(至少对我而言)。
我的主要课程如下所示
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)时,它不应该给出一些非指针异常或类似的东西。实际上什么都没有执行?是什么让它参考我的主要方法?
答案 0 :(得分:1)
执行顺序如下:
Link
对象Link
构造函数内的LinkerInterface
方法的新showNumber
实例,但此点未被调用 link.calc();
方法,后者又调用interface1.showNumber(...)
方法如果您在致电LinkerInterface
之后设置calc
,则会获得NullPointerException
(即切换步骤3和4) )。
我把int thread.sleep只是为了给我足够的时间来计算输入 在触发link.calc()之前进入扫描程序。
不正确,scanner
等待用户输入。 sleep
在这里没用,它总是会睡5秒,无论用户输入数字需要多长时间......
哦是的,编译器没有执行您的代码。 JVM呢。编译器只是将您的Java代码转换为JVM使用的字节代码。