繁体   English   中英

Java中子类的新对象创建语法的含义?

[英]Meaning of syntax of new object creation of a child class in Java?

我有下面的java程序,这是我在阅读java教程时编写的。

public class Primitive_prac {

   public static void main(String[] args) {
    // TODO code application logic here

    Parent obj1 = new Child();
    Child obj2 = new Child();

    System.out.println("ojb1 is instance of Parent: " + (obj1 instanceof Parent));
    System.out.println("ojb1 is instance of Parent: " + (obj1 instanceof Child));
    System.out.println("ojb1 is instance of Parent: " + (obj1 instanceof Interface1));

    System.out.println();

    System.out.println("ojb2 is instance of Parent: " + (obj2 instanceof Parent));
    System.out.println("ojb2 is instance of Parent: " + (obj2 instanceof Child));
    System.out.println("ojb2 is instance of Parent: " + (obj2 instanceof Interface1));

    }
}

class Parent{}
interface Interface1{}
class Child extends Parent implements Interface1{}

如您所见,我创建了一个Parent类、一个接口Interface1和一个扩展Parent并实现Interface1的子类Child

但是,我对以下声明有疑问:

 Parent obj1 = new Child();

在这种情况下 obj1 是Parent还是Child的实例? 上面这句话到底是什么意思? =左侧的Parent obj1是什么意思, =右侧的new Child()是什么意思。 Parent obj1 = new Child();是什么意思Parent obj1 = new Child(); 作为声明?

下面是程序的输出。

run:
ojb1 is instance of Parent: true
ojb1 is instance of Parent: true
ojb1 is instance of Parent: true

ojb2 is instance of Parent: true
ojb2 is instance of Parent: true
ojb2 is instance of Parent: true
BUILD SUCCESSFUL (total time: 0 seconds)

我有点困惑,因为输出显示 obj1 和 obj2 都是ParentChildInterface1实例。 创建 obj1 时的Parent词没有任何区别吗? 在创建 obj1 时编写Parent什么意义?

我发现很难用语言表达,但我希望你能得到我的问题。

谢谢。

在这种情况下 obj1 是 Parent 还是 Child 的实例?

它是 Child 的一个实例,也是 Parent 的一个实例。

上面这句话到底是什么意思?

那个 obj1 是一个孩子,正如你定义的那样,所有 Child 的实例也是 Parent 的实例,所以 obj1 也是 parent 的一个实例。

=左侧的Parent obj1是什么意思,=右侧的new Child()是什么意思。 Parent obj1 = new Child(); 是什么意思? 作为声明?

Parent obj1表示obj1是一个局部变量,可以保存任何作为 Parent 实例的对象。 您构造 Child 的事实意味着它实际上可以被分配,因为所有Child对象都是Parent s。

创建 obj1 时的 Parent 词没有任何区别吗?

是的,如果您将方法添加到Child而不是Parent您将无法在obj1上调用它,因为obj1可以保存任何 Parent,而不仅仅是一个 Child。

在创建 obj1 时编写 Parent 有什么意义?

它允许存储任何Parent ,即使不是Child

也许以下类的命名(作为类比)可能更有意义:

public class Primitive_prac {

   public static void main(String[] args) {
    // TODO code application logic here

    Animal obj1 = new Bird();
    Bird obj2 = new Bird();
    obj1.move(); //valid, since obj1 is declared `Animal`
    obj1.fly(); // invalid, since obj1 could be any animal and not all animals implement fly();
    obj2.move(); // Valid, all birds are animals and all animals (as defined here) move, therefore birds can move
    obj2.fly(); //valid, obj2 can only be a bird or a subclass, and all such objects can fly()

    System.out.println("ojb1 is instance of Animal: " + (obj1 instanceof Animal));
    System.out.println("ojb1 is instance of Bird: " + (obj1 instanceof Bird));
    System.out.println("ojb1 is instance of Flying: " + (obj1 instanceof Flying));

    System.out.println();

    System.out.println("ojb2 is instance of Bird: " + (obj2 instanceof Animal));
    System.out.println("ojb2 is instance of Animal: " + (obj2 instanceof Bird));
    System.out.println("ojb2 is instance of Flying: " + (obj2 instanceof Flying));

    }
}

class Animal{ void move("Moving...") {} }
interface Flying{ void fly(); }
class Bird extends Animal implements Flying{
    void fly() {System.out.println("flap flap");}
}

当您将对象分配给名称时,如下所示:

Parent p = new Child();

名称“p”指的是“子”对象,即使名称表示它是父对象。 这很常见,尽管示例中类型名称的选择可能会产生误导。 一个更好的现实世界的例子是:

List a = new ArrayList();

在这种情况下,您通过更通用的“List”来引用特定的“ArrayList”对象。 这是您在实际代码中经常看到的东西,通常您希望分配给最不具体的类型,以使您的代码最灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM