Java 在传递给类构造函数的匿名类中未调用Print语句

Java 在传递给类构造函数的匿名类中未调用Print语句,java,anonymous-class,Java,Anonymous Class,我有两个类和一个接口 接口: public interface MyBirthdayEvent { void itsMyBirthday(); } 头等舱: public class MyBirthdayButton { public void addOnClickedListener(MyBirthdayEvent mbe){} } 二等舱: public class MyBirthday { private MyBirthdayButton myBirthday

我有两个类和一个接口

接口:

public interface MyBirthdayEvent {
    void itsMyBirthday();
}
头等舱:

public class MyBirthdayButton
{
   public void addOnClickedListener(MyBirthdayEvent mbe){} 
}
二等舱:

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();

    }
}
从代码中可以看出,我在MyBirth构造函数中使用了一个匿名类。在这样做时,我试图将字符串
“生日快乐”
打印到控制台


我的问题是,当我主要通过创建一个新的MyBirthday对象来调用
MyBirthday
构造函数时,我没有看到控制台上打印的字符串
“生日快乐”
。它不应该打印到控制台上吗?如果没有,我做错了什么?

您可以将
System.out.println(“一些单词”)
语句移动到您的
MyBirthdayEvent
构造函数中


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

您可以将
System.out.println(“一些单词”)
语句移动到
MyBirthdayEvent
构造函数中


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

您可以执行以下操作:

public interface MyBirthdayEvent {
    void itsMyBirthday();

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

此外,它在没有它的情况下也可以工作,但是使用lambda而不是匿名内部类。这看起来好多了

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

你能做的是:

public interface MyBirthdayEvent {
    void itsMyBirthday();

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

此外,它在没有它的情况下也可以工作,但是使用lambda而不是匿名内部类。这看起来好多了

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

因此,
mybirth
的构造函数添加了
onclickedListener
。究竟是什么调用了上述方法?这是不是应该像Swing一样连接到GUI中?正如代码所示,没有任何东西可以调用该方法。除非我没有正确地阅读某些内容。总的来说,当我调用构造函数时,它不应该调用print语句吗,因为print语句存在于构造函数中?print语句不在构造函数中,而是在方法
itsmyBirth()
中调用的(正如答案所指出的)。调用该方法,或者将print语句移动到构造函数中。您应该调用它的mybirth()方法,以便能够看到输出。因此
mybirth
的构造函数添加了
onclickedListener
。究竟是什么调用了上述方法?这是不是应该像Swing一样连接到GUI中?正如代码所示,没有任何东西可以调用该方法。除非我没有正确地阅读某些内容。总的来说,当我调用构造函数时,它不应该调用print语句吗,因为print语句存在于构造函数中?print语句不在构造函数中,而是在方法
itsmyBirth()
中调用的(正如答案所指出的)。调用该方法,或者将print语句移动到构造函数中。您应该调用itsMyBirthday()方法,以便能够看到输出。接口默认值和lambda建议使用得很好。接口默认值和lambda建议使用得很好。