我有以下问题。我试图进行多态调用,结果将取决于根据底层类改变值的变量。试过不同的东西然而它不起作用。请让我知道应该改变什么。问题是虽然c.w读取局部变量w,默认为0并从适当的类中读取它,但它总是默认为0.以下是代码:
class Cycle{
private int w = 0;
public void move(){
System.out.println("Cycle moving");
}
public int wheels(Cycle c){
switch (c.w){
case 1: return 1;
case 2: return 2;
case 3: return 3;
default: return 0;
}
}
}
class Unicycle extends Cycle{
public int w = 1;
public void go(){
System.out.println("Unicycle go");
}
}
class Bicycle extends Cycle{
public int w = 2;
public void go(){
System.out.println("Bicycle go");
}
}
class Tricycle extends Cycle{
public int w = 3;
public void go(){
System.out.println("Tricycle go");
}
}
public class TestCycle {
public static void ride(Cycle c){
c.move();
int now = c.wheels(c);
System.out.println(now);
}
public static void main(String[] args){
Bicycle b = new Bicycle();
ride(b);
Unicycle u = new Unicycle();
ride(u);
Tricycle t = new Tricycle();
ride(t);
}
}
答案 0 :(得分:2)
你的问题(其中之一)就是你要在每个子类中重新定义类变量'w'。将其定义为“循环”的成员,并让每个子类在其构造函数中正确设置它。
class Cycle{
protected int w;
public void move(){
System.out.println("Cycle moving");
}
public int wheels(){
return w;
}
}
class Unicycle extends Cycle{
public Unicycle() {
w = 1;
}
public void go(){
System.out.println("Unicycle go");
}
}
或者您可以在超类中定义一个名为'wheels()'的抽象方法,并在子类中覆盖它。这是一个品味问题。
答案 1 :(得分:1)
轮子方法应该更像
public int getWheelCount(){
return this.w;
}
您在实例本身上调用它,您不需要传递参数。如果当前实例是三轮车,则该方法将返回3,等等......
答案 2 :(得分:1)
这可能不是您正在寻找的答案,但以下工作。请详细说明您的目标。
public abstract class Cycle {
protected int nWheels;
protected String goText;
// no constructor.
public void go() {
System.out.println(goText);
}
public int wheels() {
return nWheels;
}
}
...
public class Unicycle extends Cycle {
public Unicycle() {
nWheels = 1;
goText = "Unicycle go";
}
}
请注意,我制作了Cycle
abstract
,因为我不希望它被实例化。
修改强>:
public static int getNumberOfWheels(Cycle cycle) {
return cycle.wheels();
}
这显然不是很有用,因为对cycle.wheels()
的简单调用与调用此函数的方式相同。
我不确定你为什么要避免构造函数。也许你应该写下你想要回答的确切问题。
答案 3 :(得分:1)
由于Cycle.w
是私有的,因此从其继承者看不到它。这意味着例如Tricycle.w它不是“相同”变量,并且它在循环中不可见(这就是为什么你总是得到0)。你必须使Cycle.w
至少受到保护,然后从所有子类中删除w,并在每个子类的构造函数中将其值设置为你想要的值。