我无法理解这个布尔逻辑。请有人请解释一下

时间:2016-01-27 04:37:56

标签: java interface

以下是我无法理解的内容:

interface CheckPerson {
    boolean test(Person p);

public static void printPersons(
    List<Person> roster, CheckPerson tester) {
    for (Person p : roster) {
        if (tester.test(p)) {
            p.printPerson();
        }
     }
 }

据我所知,这种方法是说真正的印刷人......但是我不知道的是怎么做

boolean test(Person p);

工作和它说的是什么。

也许如果我明白这一点我就能理解

if (tester.test(p)) {
            p.printPerson();

感谢您的帮助......我还在学习。

2 个答案:

答案 0 :(得分:1)

我认为您不明白为什么在test的方法正文丢失时仍然可以致电test

首先,您需要知道test方法属于接口。接口中的方法通常没有实现(方法体)。您也无法通过调用其构造函数直接初始化接口。您只能创建实现该接口的类的实例。

一个类可以通过以下方式实现接口:

public class MyClass implements CheckPerson {

}

该类需要提供必要的方法(在本例中为test)。

public boolean test (Person p) {
    //implementation goes here...
}

现在让我们看看你的printPersons方法。它需要一个CheckPerson对象和一个人列表。现在有了一个有趣的部分,当你想要称这种方法时,你不能只是:

List<Person> list = new ArrayList<> ();
list.add(somePersonObject);
CheckPerson.printPersons(list, new CheckPerson());
                               *****************
                               this part is wrong!

正如我之前所说,接口无法通过调用其构造函数直接实例化,您需要实例化一个实现它的类并将 传递给该方法。你知道,这就是tester.test有效的原因。因为test将始终是实现接口的类,因此test将始终具有正文!让我们看看这个在行动:

让我们创建一个名为AdultTest的类:

public class AdultTest implements CheckPerson {
    public boolean test (Person p) {
        return p.getAge() > 18;
    }
}

注意:我不知道你的Person课程是什么样的,所以我提出了getAge()如果你的班级没有,请不要在你的代码中使用它。

现在我们可以无误地致电printPersons

CheckPerson.printPersons(list, new AdultTest());

然后它会打印所有年龄超过18岁的人。

&#34;但为什么要创建一个接口来实现这一目标呢?我不能创建一个接受AdultTest对象来测试它的方法吗?&#34;您询问。这是一个非常好的问题!

使用界面的好处是您可以轻松扩展其功能。例如,我可以创建另一个类来测试这个人是否是女性:

public class FemaleTest implements CheckPerson {
    public boolean test (Person p) {
        return p.getGender().equals("Female");
    }
}

再次,getGender组成了。

现在您可以将new FemaleTest()传递给printPersons方法!

如果您没有为此创建新类,则需要创建一个接受FemaleTest对象的新方法,这是一个重复的代码。不好!<​​/ p>

答案 1 :(得分:0)

if(tester.test(p))

这种代码的和平意味着: 您有 CheckPerson 名为测试人员的实例,实施检查员的类测试人员是一个实例必须有逻辑来定义接受 Person 对象作为参数的测试方法。

现在 test()方法的返回类型是布尔值,因此在if条件( if(tester.test(p)))中,基于布尔值返回 true false 它将进入打印条件,如果布尔值为false,它将不会进入条件。

注意:如果condition接受布尔值,即true或false,那么当test()方法返回一个布尔值时,它就是一个有效的表达式。