我有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而不是来自另一个类?
答案 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。