注:这是我问题的概念性版本。我关于这些概念的应用的实际问题如下所示。
我试图找出一个对象何时被认为是它自己的类或类的超类的实例。考虑以下超类“动物”和“子类海马”:
import java.util.List;
import java.util.ArrayList;
public class Animal
{
public static void main(String[] args)
{
Animal a= new Animal();
/*1. This line prints a's class*/
System.out.println(a.getClass());
List<Animal> animals= new ArrayList<Animal>(1);
animals.add(new Seahorse(1));
//2. Let's see what happens here
animals.get(0).printClass();
for(Animal e : animals)
{
e.printClass(); //3 This is an overriden method
//e.printThisClass(); Compile Time error;
//4. Note this method only exists in subclass
}
Animal hiahiahia = new Seahorse();
hiahiahia.printClass(); //5. Lets see what happens
hiahiahia.printThisClass(); //6.
}
public void printClass()
{
System.out.println("Animal");
}
}public class Seahorse extends Animal
{
private int y;
public Seahorse(int a)
{
this.y=a;
}
public void printClass()
{
System.out.println("Seahorse");
}
public void printThisClass()
{
System.out.println("Seahorse");
}
}输出结果如下:
class Animal //1.
Seahorse //2.
Seahorse //3.
Seahorse //5.您可以看到,尽管Seahorse存储在动物对象或列表中,但多态性导致调用Seahorse。
但是,当我试图调用一个名称仅存在于Seahorse子类中的方法时,编译会抛出一个错误。
问:多态性只在方法覆盖时才有效,这是真的吗?有什么时候
Animal animal = new Seahorse(1);使动物只被视为动物(而不是海马)?
有什么区别
Animal animal = new Seahorse();
animal.printThisClass();和
((Seahorse)animal).printThisClass();最后,我应该什么时候使用铸造?
我正在进行一场2d游戏,并创建了以下课程:
public class Entity
{
}和
public class Character extends Entity
{
//With bunch of extra fields and methods
}我还有一个控制器类,它有两个字段:
private List<Entity>;
private List<Character>;我将它们分开,因为实体(在本例中是箭头、子弹)只与字符碰撞,而与其他实体不碰撞。问题是:我还有一个绘制我所有实体的BufferedImage的呈现方法。现在,为了使图形有意义,实体应该按照其Y值的升序呈现。(也就是说,从最远到最近)。但是,这需要将所有字符和实体放在同一个集合中.
问题是:我是否应该把它们分开?如果我把它们放在同一个列表中,这会不会引起混淆,因为你不能区分字符和实体?
谢谢:)
发布于 2017-06-03 01:43:47
对第一个问题的回答:
有什么区别 动物=新海马();animal.printThisClass();和 ((海马)动物).printThisClass()
没有什么不同。当你把那只动物丢给海马时,它允许你访问海马的方法。例如,如果Seahorse类有一个名为blowBubble()的方法,如果您执行了animal.blowBubble()(假设animal.blowBubble()是像上面那样定义的),那么它会给您一个错误,因为这个动物类没有一个名为blowBubble()的方法。
但是,当您通过执行((Seahorse)animal)将动物变量传递给Sea马时,您是在说我知道这个动物是一匹海马,所以请允许我使用西马的方法。
Animal animal = new Seahorse();
animal.method();
((Seahorse)animal).method(); // calls the exact same method even if it was overriden但是,如果你这样做,你会注意到的
Animal animal = new Animal();
((Seahorse)animal).blowBubbles();
((Seahorse)animal).method();每次你尝试施放它时,它都会抛给你一个ClassCastException,因为动物不能被转换成海马。但是,因为一匹海马总是和动物一样,你可以在一个海马实例上调用任何动物方法。
Seahorse seahorse = new Seahorse();
seahorse.methodInAnimalClass();用于您的下一个问题,有两个单独的字符和实体列表完全取决于您。因为你需要做一个简单的排序算法来确定谁有最大的或最低的Y位置,这可能并不重要。
您可以始终创建一个名为getAllEntities()的方法,该方法返回一个新列表,该列表将实体和字符组合在一起,然后对该列表进行排序并呈现它们。
比如,评论说,您也应该查看接口,但我不建议创建大量的接口。我认为简单的开始是要走的路,然而,随着你的游戏变得先进,你可能会想要去实现它们。
https://stackoverflow.com/questions/44339171
复制相似问题