区分继承的类

时间:2012-05-03 07:55:04

标签: java extends

我有3个班,首先是人:

public class Person {    
    Person() {

    }
}

其次是人员延伸的工程师

public class Engineer extends Person { 
    Engineer() {

    } 
}

和Person的另一个扩展

public class Doctor extends Person {
    Doctor() {

    } 
}

最后一个是将构造函数作为对象Person的工作

public class Work {
    Work(Person p) {
    //how to insure that p is Engineer ?
    }
}

如何检测对象p是Engeneer而不是来自另一个类?

7 个答案:

答案 0 :(得分:6)

您可以使用instanceof关键字来检查对象的类型。它像这样工作

if(p instanceof Engineer) {
   // do Engineer stuff
} else {
   // not an Engineer object
}

答案 1 :(得分:2)

您可以使用以下方法进行检查:

if (p instanceof Engineer)

if (p.getClass() == Engineer.class)

答案 2 :(得分:1)

使用类似:

if (p.getClass() == Engineer.class) {
    //Is engineer
}

答案 3 :(得分:1)

public class Work {

    // ensure only Engineer can pass in
    Work(Engineer p) {

    }
}

或使用instanceof关键字

  

instanceof运算符将对象与指定类型进行比较。您   可以使用它来测试对象是否是类的实例,实例   子类的实现,或实现特定的类的实例   接口

public class Work {

    Work(Person p) {
        // make sure p is type of Engineer
        if(p instanceof Engineer) {
            // dowork
            Engineer e = (Engineer) p;
        } else {
            // not engineer or p is null
        }
    }
}

答案 4 :(得分:1)

p.getClass() 

(从那里,.getName()

或运营商instanceof(注意,医生和工程师将返回instanceOf Person为真;请检查更具体的课程)

答案 5 :(得分:1)

你不应该这样做。

Work(Engineer p) {
    // p is an Engineer
}

Work(Person p) {
    p.doWork(); // calls the appropriate work methopd for any person.
}

答案 6 :(得分:1)

使用instanceof关键字,如

if(p instanceof Engineer) {
    // do something
}

if(p instanceof Doctor) {
    // do something
}

但这不是正确的方法, 你应该在工程师的课堂上有Enginner的行为(方法)和Doctor在Doctor课程中的行为。

参见Peter的回答,Runtime polymorphism将检测自动调用哪种方法。

class Engineer extends Person {
    // properties
    // methods
    public void doWork() {
        // does engineering work
    }
}

class Doctor extends Person {
    // properties
    // methods
    public void doWork() {
        // does doctor work like check patients, operation or other his task
    }
}

class Work {
    Work(Person p) {
        p.doWork(); // if you pass engineer obj here, Engineer.doWork() is called. And if you pass doctor, Doctor.doWork() is called.
        // You don't need to use instanceof.
    }
}

在上述情况下,Engineer和Doctor具有相同的方法名称,但在某些情况下,您可能需要使用instanceof,例如医生会有checkPatient()方法,工程师会有一些不同的方法名称,比如designEngine(),那么你将不得不使用instanceof。