Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据变量类型选择要使用的方法_Java_Parent Child - Fatal编程技术网

Java 如何根据变量类型选择要使用的方法

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

我的问题是: 我有一个类片段,它的getName方法返回“P”(这只是一个示例) 我有另一个类King,它扩展了Piece并重新定义了getName方法以返回“K”

现在我有了一个片段数组(片段[]数组)(在这个数组中有实例King的对象) 当我从所有这些对象调用getName时,我总是从所有对象得到“P”。 我想从King对象中得到“k”,从Piece对象中得到“P”。 下面是一个例子:

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
。我假设是后者,因此我的答案就是基于此。请参阅我较新的答案。=)这是另一个问题我会提出另一个问题寻找另一个问题