尝试通过不同的类查看对象的实例数据

时间:2015-09-03 18:24:05

标签: java class instance instanceof

我有一个程序,其中有四个类Programmer的对象以及一些其他所有继承我的父类Employee的类。

因此,在我的main方法中,我将这些Employee个对象存储在ArrayList中。 Programmer类的主要实例数据是' technologies'它拥有他们所知道的各种技术的字符串。例如,' SQL',' Java',' Python' ...等。

好吧,我被困了,因为我需要确定我的程序员中有多少人知道Java并累计他们的个人收入等等。当然,当我循环浏览Employee ArrayList时......

            for (Employee e : staff)
    {
        System.out.println(e.toString());
        salaryTotal += e.getSalary();
        if (e instanceof Programmer){
            programmerStaff++;
            if (e.technologies.contains("Java")){
            }
        }
    }

它查找实例数据'技术'在我的Employee课程中,在确定了{instance Programmer的e instanceof后,如何让它查看对象的实例化类?

我也尝试过使用访问方法,但它只会在Employee

中查找所述方法

2 个答案:

答案 0 :(得分:1)

您必须将其投射到Programmer

if (((Programmer) e).technologies.contains("Java"))

我们在括号中添加了(Programmer) e,因为如果没有,它会尝试将contains方法返回的内容(在本例中为布尔值)转换为Programmer。< / p>

你也可以这样做:

Programmer programmer = (Programmer) e;

并非所有类型都可以投放到其他特定类型,因此使用instanceof进行检查是避免ClassCastException的好习惯。

答案 1 :(得分:0)

您有两种选择。按照你的方式做它你可以投下它。

for (Employee e : staff){
    System.out.println(e.toString());
    salaryTotal += e.getSalary();
    if (e instanceof Programmer){
        programmerStaff++;
        Programmer p = (Programmer) e
        if (p.technologies.contains("Java")){
        }
    }
}

然而,我不是这种技术的粉丝。我认为它在逻辑上令人困惑(为什么你的方法只关心程序员知道编程语言?为什么你必须知道你有什么子类?它只是凌乱)和丑陋的。

我会将一些功能移到超类中。在Employee中有一个方法knowsLanguage(String language)。然后,对于从不知道任何编程语言的类,返回false,对于程序员,返回true / false。

您还可以更改instanceOf以使用类似的技术。 knowsProgramming()在我脑海中更清晰(你可以添加其他程序员类没有问题,也许你想在以后的某个类中有程序员/设计师)