Java 为什么我可以将一个类的对象添加到另一个类的LinkedList?
我有一门课是这样的:Java 为什么我可以将一个类的对象添加到另一个类的LinkedList?,java,Java,我有一门课是这样的: public class One { private int idOne; private String nameOne; //Getter and Setter } 另一个类扩展了一个: public class Two extends One { private String moreThings; private String example; //Getter and Setter } 然后拥有LinkedList
public class One {
private int idOne;
private String nameOne;
//Getter and Setter
}
另一个类扩展了一个:
public class Two extends One {
private String moreThings;
private String example;
//Getter and Setter
}
然后拥有LinkedList myList=newLinkedList()代码>
如果我指定列表将包含One
对象LinkedList
,我不明白为什么我可以向该列表添加2个对象。例如:
LinkedList<One> myList = new LinkedList<>();
Two t1 = new Two();
Two t2 = new Two();
myList.add(t1);
myList.add(t2);
LinkedList myList=新建LinkedList();
Two t1=新的Two();
Two t2=新的Two();
添加(t1);
添加(t2);
这很酷,但我不知道为什么我可以这么做。这是因为一个扩展了两个。这就是所谓的多态性
但是,您不能执行List
操作,然后将One
类型的对象添加到Two
类型的列表中
类型为two
的对象至少拥有one
所拥有的一切,这就是它工作的原因。请尝试使用类名Animal
和Cat
来代替one
和two
您声明您的列表应该包含Animal
对象,因此它将接受Cat
将您的问题作为一个真实世界的示例,让您拥有一个类Animal
,具有running()
,eating()
,drinking()等方法
等等。现在,您的类将看起来像
class Animal
{
public void running()
{
//some code
}
public void eating()
{
//some code
}
public void drinking()
{
//some code
}
}
让您有另外两个类Dog
和Cat
,因为它们是动物的类型,所以它们可以扩展animal
类。
所以这样说是完全正确的
Animal animalObject=new Dog(); // a dog is a type of animal
or
Animal animalObject=new Cat(); //cat is a type of animal
or
Dog dogObject=new Dog(); //Nothing special
or
Cat catObject=new Cat(); //Nothing special
但是,以下内容无效
Dog dogObject=new Animal();
or
Cat catObject=new Animal();
因为(再读一遍那句话。)并给出一个……) 因为第二类是第一类的子集;这意味着每两个都是一个,但一个不一定是两个。参考前面的答案,猫(二)是动物(一)的一个子集
在您的例子中,您正在初始化对象1(动物)的链接列表,然后在其中添加对象2(Cat),这是有意义的,因为2(Cat)是1(动物)
但是如果你要走另一条路,例如;将一只(动物)添加到两只(猫)的链表中
它会给你一个错误。因为它扩展了一个
。您确实编写了一个扩展的
,原因是什么?因为多态性。Two
的每个实例也是One
的一个实例。例如,如果你使用一个链接列表
,这也会起作用。著名的名言“狗永远是一只动物,但你不能说动物永远是一只狗,就像这三个人说的那样。要了解更多有关此类关系的解释,建议您考虑现实世界中的对象,而不是抽象名称(“一”、“二”、“myList”等)。就像nobalG做的狗/动物类比一样,我希望你能扩展你的答案,因为“如果继续这样,我将不得不否决你。”