Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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_Class_Object_Inheritance - Fatal编程技术网

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和

我最近读了一本关于Java设计模式的书,遇到了从其他类继承而来的类,并通过将

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
 }
}