未在传递给 class 构造函数的匿名 class 中调用的打印语句

Print statement not called in anonymous class passed to class constructor

我有两个 classes 和一个接口。

接口:

public interface MyBirthdayEvent {
    void itsMyBirthday();
}

第一个class:

public class MyBirthdayButton
{
   public void addOnClickedListener(MyBirthdayEvent mbe){} 
}

第二个class:

public class MyBirthday {

    private MyBirthdayButton myBirthdayButton = new MyBirthdayButton();

    MyBirthday() {
        myBirthdayButton.addOnClickedListener(new MyBirthdayEvent() {

        public void itsMyBirthday() {
            System.out.println("Happy Birthday");
    }           

    });
    }
}

然后在主要部分,我有这个:

public class TestThisStuff {

    public static void main(String[] args) {

    MyBirthday myBirthday = new MyBirthday();

    }
}

从代码中可以看出,我在 MyBirthday 构造函数中使用了匿名 class。这样做时,我试图让字符串 "Happy Birthday" 打印到控制台。

我的问题是,当我通过创建一个新的 myBirthday 对象在 main 中调用 MyBirthday 构造函数时,我没有看到字符串 "Happy Birthday" 打印到控制台。它不应该打印到控制台吗?如果不是,我做错了什么?

您可以将 System.out.println("some words") 语句移动到您的 MyBirthdayEvent 构造函数

它没有显示在您的控制台中,因为您还没有调用该方法

你能做的是:

public interface MyBirthdayEvent {
    void itsMyBirthday();

    default void invoke() {
        itsMyBirthday();
    }
}

...

public class MyBirthdayButton
{
   public void addOnClickedListener(MyBirthdayEvent mbe){
       mbe.invoke();

   } 
}

...

此外,没有它它也能工作,但使用 lambda 而不是匿名内部 class。这看起来好多了。

MyBirthday() {
        myBirthdayButton.addOnClickedListener(() -> 
                                       System.out.println("Happy Birthday"));
    }