Java 如何根据变量类型选择要使用的方法
我的问题是: 我有一个类片段,它的getName方法返回“P”(这只是一个示例) 我有另一个类King,它扩展了Piece并重新定义了getName方法以返回“K” 现在我有了一个片段数组(片段[]数组)(在这个数组中有实例King的对象) 当我从所有这些对象调用getName时,我总是从所有对象得到“P”。 我想从King对象中得到“k”,从Piece对象中得到“P”。 下面是一个例子:Java 如何根据变量类型选择要使用的方法,java,parent-child,Java,Parent Child,我的问题是: 我有一个类片段,它的getName方法返回“P”(这只是一个示例) 我有另一个类King,它扩展了Piece并重新定义了getName方法以返回“K” 现在我有了一个片段数组(片段[]数组)(在这个数组中有实例King的对象) 当我从所有这些对象调用getName时,我总是从所有对象得到“P”。 我想从King对象中得到“k”,从Piece对象中得到“P”。 下面是一个例子: Piece[] p = new Piece[1]; p[0] = new King(); p[0].get
Piece[] p = new Piece[1];
p[0] = new King();
p[0].getName() //I got "P" not "K"
如何解决我的问题
谢谢 删除以前的答案
我已经纠正了我先前回答中的错误,并提出了解决方案。我向名为getSpecificName()
的子类添加了一个新方法,它接受一个int
参数来决定调用哪个getName()
,从而为您提供正确的值
代码可在以下位置获得:
删除先前的答复
我已经纠正了我先前回答中的错误,并提出了解决方案。我向名为getSpecificName()
的子类添加了一个新方法,它接受一个int
参数来决定调用哪个getName()
,从而为您提供正确的值
代码可在以下位置获得:
您可能想做的是将
Piece
作为一个抽象类。因为它是一个可能不会直接实例化的基类,所以您将有其他扩展它的类,这些类是具体的类,即-国王、王后、兵、车、主教、骑士等
public abstract class Piece {
... // other code
public abstract String getName();
... // other code
}
public class King extends Piece {
... // other code
@Override
public String getName() {
return "K";
}
... // other code
}
您可能想做的是将
Piece
作为一个抽象类。因为它是一个可能不会直接实例化的基类,所以您将有其他扩展它的类,这些类是具体的类,即-国王、王后、兵、车、主教、骑士等
public abstract class Piece {
... // other code
public abstract String getName();
... // other code
}
public class King extends Piece {
... // other code
@Override
public String getName() {
return "K";
}
... // other code
}
由于您没有显示任何代码,我将向您展示一个简单的示例:
public class Piece {
public String getName() {
return "P";
}
}
public class King extends Piece {
@Override
public String getName() {
return "K";
}
}
public class JavaTest {
public static void showNames(Piece[] p) {
for (Piece x : p) {
System.out.println(x.getName());
}
}
public static void main(String[] args) {
Piece[] p = new Piece[]{
new Piece(),
new King()
};
showNames(p);
}
}
输出
P
K
由于您没有显示任何代码,我将向您展示一个简单的示例:
public class Piece {
public String getName() {
return "P";
}
}
public class King extends Piece {
@Override
public String getName() {
return "K";
}
}
public class JavaTest {
public static void showNames(Piece[] p) {
for (Piece x : p) {
System.out.println(x.getName());
}
}
public static void main(String[] args) {
Piece[] p = new Piece[]{
new Piece(),
new King()
};
showNames(p);
}
}
输出
P
K
您是否绝对确定King扩展了这一块 这被称为is-a关系。一个
King
是一个片段
,因此它从片段
继承是有意义的
public class Piece {
public String getValue() {
return "P";
}
}
public class King extends Piece {
public String getValue() {
return "K";
}
}
这样,当您实例化一个新的
King
时,getValue()
将返回“K”
,正如您所期望的那样。您是否绝对确定King扩展了一个片段
这被称为is-a关系。一个King
是一个片段
,因此它从片段
继承是有意义的
public class Piece {
public String getValue() {
return "P";
}
}
public class King extends Piece {
public String getValue() {
return "K";
}
}
这样,当您实例化一个新的
King
时,getValue()
将返回“K”
,正如您所期望的那样。显示代码。我们将更容易帮助您。向我们展示代码。我们可以更容易地帮助您。如果方法被重写,那么将调用重写类的方法,而不是父方法。我刚刚测试了一下。是的,将片段
下放到King
中,然后调用该方法。我知道我的例子是愚蠢的,但我使用它是为了方便。使用某种类型的检查,比如kiece[0]instanceof King{…}
@Makoto-Hmm。。我的答案是我记得读过的书。让我也检查一下=)您不需要静态地强制转换Dog
变量来运行Dog
的makeSound()
。运行时多态性将调用Dog
版本的makeSound
,无论对象是静态的Dog
还是Animal
。从技术上讲,您是正确的,但您仍然做得太多了。您只需要重写方法。我看不到第二个方法的价值或必要性。如果该方法被重写,则调用重写类的方法,而不是父方法。我刚刚测试了一下。是的,将片段
下放到King
中,然后调用该方法。我知道我的例子是愚蠢的,但我使用它是为了方便。使用某种类型的检查,比如kiece[0]instanceof King{…}
@Makoto-Hmm。。我的答案是我记得读过的书。让我也检查一下=)您不需要静态地强制转换Dog
变量来运行Dog
的makeSound()
。运行时多态性将调用Dog
版本的makeSound
,无论对象是静态的Dog
还是Animal
。从技术上讲,您是正确的,但您仍然做得太多了。您只需要重写方法。我看不出第二种方法的价值或必要性。谢谢,我忘了@Override。现在我知道我们为什么使用it@rabahRachid您从未声明是将Piece
变量存储在Piece[]
中,还是仅存储King
。我假设是后者,因此我的答案就是基于此。请参阅我较新的答案。=)这是另一个问题,我将提出另一个问题查找另一个问题,谢谢我忘记了@Override。现在我知道我们为什么使用it@rabahRachid您从未声明是将Piece
变量存储在Piece[]
中,还是仅存储King
。我假设是后者,因此我的答案就是基于此。请参阅我较新的答案。=)这是另一个问题我会提出另一个问题寻找另一个问题