Java 从超类的对象数组访问子类的函数
我有classJava 从超类的对象数组访问子类的函数,java,Java,我有classCarte和Croyant,DeuxEx是Carte的子类。在Croyant和DeuxEx中,每个类中都有属性valueCroyant或valueDeuxEx。我创建了一个类Carte的Object数组。如何从该数组的对象访问方法getValueCroyant()或getValueDeuxEx() Class Carte { private int id; public Carte(int id){ this.id=id; } } Class
Carte
和Croyant
,DeuxEx
是Carte
的子类。在Croyant
和DeuxEx
中,每个类中都有属性valueCroyant
或valueDeuxEx
。我创建了一个类Carte
的Object
数组。如何从该数组的对象访问方法getValueCroyant()
或getValueDeuxEx()
Class Carte {
private int id;
public Carte(int id){
this.id=id;
}
}
Class Croyant extends Carte{
private int valueCroyant;
public Croyant(int id){
super(id);
}
public int getValueCroyant(){
return this.valueCroyant;
}
}
Class DeuxEx extends Carte{
private String valueDeuxEx;
public DeuxEx(int id){
super(id);
}
public String getValueDeuxEx(){
return this.ValueDeuxEx;
}
}
public static void main(String[] agrs){
ArrayList<Carte> array_carte = new ArrayList();
Croyant cr1 = new Croyant(1);
Croyant cr2 = new Croyant(2);
DeuxEx de1= new DeuxEx(3);
DeuxEx de2 = new DeuxEx(4);
array_carte.add(cr1);
array_carte.add(cr2);
array_carte.add(de1);
array_carte.add(de2);
for(Carte c:array_carte){
if(c instanceof Croyant){
System.out.println(c.getValueCroyant());
}else{
System.out.println(c.getValueDeuxEx());
}
}
}
类点菜{
私有int-id;
公共点菜(int id){
这个.id=id;
}
}
类Croyant扩展了Carte{
私人内部价值观;
公共克罗地亚人(国际身份证){
超级(id);
}
public int getValueCroyant(){
返回此.valueCroyant;
}
}
类DeuxEx扩展了Carte{
私有字符串valueDeuxEx;
公共DeuxEx(内部id){
超级(id);
}
公共字符串getValueDeuxEx(){
返回此.ValueDeuxEx;
}
}
公共静态void main(字符串[]agrs){
ArrayList数组_carte=新的ArrayList();
Croyant cr1=新Croyant(1);
Croyant cr2=新Croyant(2);
DeuxEx de1=新的DeuxEx(3);
DeuxEx de2=新的DeuxEx(4);
数组\点菜添加(cr1);
数组\点菜添加(cr2);
数组_-carte.add(de1);
数组_-carte.add(de2);
for(Carte c:array_Carte){
if(Croyant的c实例){
System.out.println(c.getValueCroyant());
}否则{
System.out.println(c.getValueDeuxEx());
}
}
}
我想做一个这样的for循环,但它不起作用。谁能帮帮我吗 c.getValueCroyant()不会编译,因为它的类型是Carte,即超类。
即使它不优雅,调用这个方法,使用instanceOf也很好,但是您还必须对Croyant进行强制转换我认为您应该进行强制转换。所显示的代码段将不会编译 大概是这样的:
for(Carte c:array_carte){
if(c instanceof Croyant){
System.out.println(((Croyant)c).getValueCroyant());
}else if(c instanceof DeuxEx){
System.out.println(((DeuxEx)c).getValueDeuxEx());
}
}
检查我的答案。您试图做的事情强烈暗示您的设计存在问题。另一个答案中的建议是使用
instanceof
和casting进行测试,但这是非常反OO的。基本上,这种解决方案避免了多态性
我看到
valueCroyant
是int
而valueDeuxEx
是字符串。最好的解决方案是重新考虑您的设计,使这些值要么是相同的类型,要么实现一些公共接口。然后将值和getter移动到公共超类Carte
。如果不可能用同一类型来表示两个值,那么就给Carte
一个抽象方法,用于对值进行处理,并在每个子类中以不同的方式实现它。该代码甚至不会编译。你所说的“束”也可能是指“环”。Google和Google translate是您在这里的朋友。您的main()
是这里的一部分,还是您只是在尝试执行此代码?请根据OPs问题详细说明答案,如果这看起来与其他类似,请标记重复link@nullpointer谢谢我编辑以显示我所指的类型转换。(Croyant)c工作得很好。这就是我发现的。多谢各位^^