在玩 Java 8 的 lambda 时。我注意到尝试以三种方式访问接口成员变量时的一个有趣行为。
import java.util.*;
public interface Pet {
String kind ="Pet";
default void interact() { System.out.println(String.format("Wanna buy a %s", this.kind)); }
}
class Frog implements Pet {
public String kind ="Frog";
public void interact() { System.out.println(this.kind); }
}
class Rat implements Pet {
public String kind ="Rat";
public void interact() { System.out.println(this.kind); }
}
public class InternalIteration {
public static void main(String[] args) {
List<Pet> pets = Arrays.asList(new Rat(), new Frog());
System.out.println("Speak method output:");
pets.forEach((Pet p)->{
p.interact();
});
System.out.println("Un-casted class kind member variable:");
pets.forEach((Pet p)->{
System.out.println(p.kind);
});
System.out.println("Casted class kind member variable:");
System.out.println(((Rat)pets.get(0)).kind);
System.out.println(((Frog)pets.get(1)).kind);
}
}
运行此代码会得到以下结果:
Speak method output:
Rat
Frog
Un-casted class kind attribute:
Pet
Pet
Casted class kind attribute:
Rat
Frog
似乎当通过interact
方法的实现访问变量时,访问的变量是实现类中的变量。但是,当直接访问公共变量时,会返回接口成员变量。转换后直接访问它似乎再次返回实现变量。
这看起来很混乱,如果不是不一致的话,因为即使在同一个对象上操作时,访问interact
方法和公共变量也会返回不同的结果。kind