Java继承实例化
我最近读了一本关于Java设计模式的书,遇到了从其他类继承而来的类,并通过将Java继承实例化,java,class,object,inheritance,Java,Class,Object,Inheritance,我最近读了一本关于Java设计模式的书,遇到了从其他类继承而来的类,并通过将 Superclass s = new Subclass() 相对于 Subclass s = new Subclass() 我最初的想法是,它更多的是从设计的角度来看,由于抽象或信息隐藏。然而,我仍然不确定,也没有找到一个明确的解释 为什么有人会使用超类s=new Subclass()进行实例化,使用子类s=new Subclass()是否可以接受 如果有人能帮我弄清楚这件事,我将不胜感激 想象一个类Animal和
Superclass s = new Subclass()
相对于
Subclass s = new Subclass()
我最初的想法是,它更多的是从设计的角度来看,由于抽象或信息隐藏。然而,我仍然不确定,也没有找到一个明确的解释
为什么有人会使用超类s=new Subclass()
进行实例化,使用子类s=new Subclass()
是否可以接受
如果有人能帮我弄清楚这件事,我将不胜感激 想象一个类
Animal
和子类Dog
和Cat
。您现在想要创建一个动物管理系统。为了简单起见,您希望将所有动物都列在一个列表中。你现在可以写:
List<Animal> managementList = new ArrayList<>();
这很容易维护,因为Dog
s和Cat
s都是Animal
s
现在从列表中检索动物时,您可以执行以下操作:
Animal theFirstAnimal = managementList.get(0);
因为你是一个聪明的经理,你知道第一种动物是狗。所以你也可以写:
Dog theFirstAnimal = (Dog) managementList.get(0);
如果你不再确定第一只动物是否是狗,但你真的想用它做点什么,只有当它是狗时,你可以使用instanceof
来检查它是否真的是狗
if(managementList.get(0) instanceof Dog)
{
doSomething();
}
为了回答您的最后一个问题,是否可以简单地实例化子类:当然可以。如果你不喜欢猫,只想和狗一起工作,没有人会阻止你这么做:
List<Dog> dogManagementList = new ArrayList<>();
List dogManagementList=new ArrayList();
谈到向上转换,函数参数的形式也很有用:
public class Music {
public static void tune(Instrument i) {
// ...
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind flute = new Wind(); //Wind extends Instrument
tune(flute); // Upcasting
}
}
方法Music.tune()
接受乐器引用,但也接受从乐器派生的任何内容
从风到乐器的向上投射可能会“缩小”该界面,但它不能使其小于乐器的完整界面。格式化您的问题和代码!请参阅是否可以使用
扫描仪sc=新扫描仪(System.in)代码>改为对象sc=新扫描仪(System.in)代码>?对你为什么要问这个问题?@JohannesKuhn虽然这是可以接受的,但OP问你为什么会使用这样的东西,因为它看起来很混乱。Ben给出的答案,以及上面由khelwood链接的问题中的前两个答案,都回答了这个问题。所有这些神奇之处都被称为多态性代码>本身也是一个很好的例子。如果您决定将ArrayList
更改为列表的另一个实现(当然,如果您没有使用任何特定于ArrayList的方法调用),则只需更改这些实例化。如果是ArrayList managementList=new ArrayList()代码>您必须在多个地方更改它。@KevinCruijssen是的,这确实是一个非常有用的机制的实际例子。现在决定使用LinkedList
?您只需要更改一行代码,因为LinkedList
和ArrayList
都是列表
。我甚至没有注意到这一小部分:)非常感谢你的回复,它帮了我很大的忙。所以你能说这是抽象吗?您只需要知道动物的关键细节,因此子类中的任何额外内容都与手头的任务无关?在本例中,Animal
是一个抽象,是的。
public class Music {
public static void tune(Instrument i) {
// ...
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind flute = new Wind(); //Wind extends Instrument
tune(flute); // Upcasting
}
}