【问题标题】:Creating and initializing array in Java. What does `new` mean? [duplicate]在 Java 中创建和初始化数组。 “新”是什么意思? [复制]
【发布时间】:2020-07-08 19:06:18
【问题描述】:

当我有一个类Animal 并且当我想为这些对象创建一个数组时,我编写了这行代码Animal[] animal = new Animal[4]。我想像这样的图片:

如果我有扩展Animal 的类Cat,我也可以编写Cat[] cat = new Cat[4] 来创建一个数组。我也想像这样的图片:

但问题是Animal[] animal = new Cat[4] 这一行是做什么的。

【问题讨论】:

  • 从顶部图片中取出Animal[] 指针并将其指向底部图片中的猫数组。
  • 那么你想说Animal[] 指向Cat[] 指向堆中Cat 的数组吗?
  • new 仅表示您为数组对象分配内存
  • Animal[] animal 声明了一个动物数组类型的变量,new Cat[4] 创建了一个猫数组。
  • “那么你是说 Animal[] 指向 Cat[] 指向堆中的 Cat 数组吗?”——不,Animal[] 变量指向 Cat 中的数组堆。不涉及Cat[] 变量。

标签: java arrays oop


【解决方案1】:

“new”关键字使您的机器为新对象分配内存。

在这种情况下,您正在初始化的新对象是一个数组,并且该数组有足够的空间来容纳 4 个动物对象。由于 Cat 扩展了动物,因此猫也可以在这里,但任何其他动物都可以是 Dogs、Pigs,只要它们扩展了 Animal。

由于这是一个动物类型的数组,即使其中有猫对象,您也只能引用动物类型的方法声明。

在我们转到一个有数组的例子之前,这里是一个没有数组的例子:

public static void main(String[] args) {
        Animal myCat = new Cat();
        // prints "meow". Works because it's from an animal method  
        myCat.speak(); 

        // This doesn't work - unknown method - b/c it's not declared in animal class
        myCat.lickSelf(); 
    }

    private static class Animal {
        public void speak() {
            System.out.println("barf");
        }
    }

    private static class Cat extends Animal {
        public void speak(){
            System.out.println("meow");
        }
        public void lickSelf(){
            System.out.println("slurp");
        }
    }

现在让我们来看看数组的东西:

任何扩展 cat 的对象都可以放在这里,但您只能访问 Animal 属性。

public static void main(String[] args) {
    Animal[] myCats = new Cat[4];
    myCats[0] = new Cat(); // can only put cats in here
    myCats[1] = new Cat(); // but can only reference Animal properties
    myCats[2] = new Cat();
    myCats[3] = new Animal(); // Throws exception, must be a cat. 

    myCats[1].speak(); // prints "meow"

    // This doesn't work, even though a cat object is here. 
    //Can only reference as an Animal.
    myCats[2].lickSelf();

}

如果你想使用 cat 方法/属性,你需要这样做:

Cat[] myCats = new Cat[4]

如果您只想使用可能被覆盖的动物属性,但此处只允许猫,请使用:

Animal[] myCats = new Cat[4]

如果您只想使用动物属性,但允许任何类型的动物:

Animal[] myCats = new Animal[4]

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 2015-03-24
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多