Java铸造对象

Java铸造对象,java,class,variables,reference,casting,Java,Class,Variables,Reference,Casting,我有两个班:老师和协调员协调员扩展教师 基本上,我想创建一个实例变量,可以接受教师实例或协调人实例 ((Coordinator)exp).coordinate(); 我知道只要编写Teacher exp=new Teacher()或Teacher exp=new Coordinator(),就很容易做到这一点,但是当我这样做时,我只能在应用new Coordinator()或new Teacher()时访问Teacher方法和属性到正常的参考变量。我的问题是,是否有另一种方式,我只使用一个实例

我有两个班:
老师
协调员
<代码>协调员扩展
教师

基本上,我想创建一个实例变量,可以接受
教师
实例或
协调人
实例

((Coordinator)exp).coordinate();

我知道只要编写
Teacher exp=new Teacher()
Teacher exp=new Coordinator()
,就很容易做到这一点,但是当我这样做时,我只能在应用
new Coordinator()
new Teacher()时访问
Teacher
方法和属性
到正常的参考变量。我的问题是,是否有另一种方式,我只使用一个实例变量,可以分配给教师或协调器对象,并使用此变量调用分配给对象引用变量的对象的任何属性/方法?

您可以检查exp是否是协调器,然后强制转换并调用其函数因此:

if(exp instanceof Coordinator) {
    ((Coordinator)exp).foo();
}
如果有几件事要做,可以在局部范围内创建变量并重复使用:

if(exp instanceof Coordinator) {
    Coordinator expCoord = (Coordinator)exp;
    expCoord.foo();
    expCoord.bar();
    expCoord.baz();
}

您可以检查exp是否是协调器,然后相应地强制转换并调用其函数:

if(exp instanceof Coordinator) {
    ((Coordinator)exp).foo();
}
如果有几件事要做,可以在局部范围内创建变量并重复使用:

if(exp instanceof Coordinator) {
    Coordinator expCoord = (Coordinator)exp;
    expCoord.foo();
    expCoord.bar();
    expCoord.baz();
}

每当您想要调用
协调器
的方法时,必须首先将对象强制转换为
协调器

((Coordinator)myTeacher).coordinatorMethod();

每当您想要调用
协调器
的方法时,必须首先将对象强制转换为
协调器

((Coordinator)myTeacher).coordinatorMethod();

不,因为类型安全。但你总是可以做到:

Teacher exp = new Coordinator()
((Coordinator)exp).someCoordinatorMethodOrProperty()

不,因为类型安全。但你总是可以做到:

Teacher exp = new Coordinator()
((Coordinator)exp).someCoordinatorMethodOrProperty()

除非要调用的所有方法都存在于父类中,否则无法执行此操作

您可以将教师变量中的内容转换为协调器,但如果教师变量中的内容不是真正的协调器对象实例,则转换将失败

((Coordinator)exp).coordinate();

除非要调用的所有方法都存在于父类中,否则无法执行此操作

您可以将教师变量中的内容转换为协调器,但如果教师变量中的内容不是真正的协调器对象实例,则转换将失败

((Coordinator)exp).coordinate();
是的,你是对的

在这里,相同的概念实现为父子关系 由于子类的实例既可以访问子类的属性,也可以访问父类的属性,但父类的实例只能访问子类的属性

这就是它发生的原因。

是的,你是对的

在这里,相同的概念实现为父子关系 由于子类的实例既可以访问子类的属性,也可以访问父类的属性,但父类的实例只能访问子类的属性


这就是为什么会发生这种情况。

您确实意识到类可以从现有类进行扩展。您已经编写的代码如何从尚未扩展的类中预测方法?反射API是唯一健全的机制。其他选项是编写保证指定类所需协议的接口。您如何知道它是否是
协调器
?您知道类可以从现有类扩展。您已经编写的代码如何从尚未扩展的类中预测方法?反射API是唯一健全的机制。其他选项是编写保证指定类所需协议的接口。您如何知道它是否是
协调器
?因此执行此操作后,将
教师经验
(分配给协调器对象)永久成为
协调器exp
?否。它仅适用于第一个示例中的该表达式或第二个示例中的该范围。因此,执行此操作后,将
教师exp
(分配给协调器对象)永久成为
协调器exp
否。它仅适用于第一个示例中的表达式或第二个示例中的该范围。