以下是我无法理解的内容:
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();
感谢您的帮助......我还在学习。
答案 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()方法返回一个布尔值时,它就是一个有效的表达式。