以不同方式访问接口成员变量,结果不同

时间:2017-09-12 16:31:31

标签: java inheritance interface member-hiding

在为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公共变量返回不同的结果,即使在同一个对象上运行,这看起来也很混乱。

0 个答案:

没有答案