什么决定了数组是否可以在Java中保存对象

时间:2018-07-05 13:45:07

标签: java

我有一个Image类,并如下初始化了一个数组。 Java在这里允许我在images数组中只有Image对象。为什么我不能为图像数组分配字符串或任何其他值?对于String [] names = new String[3],names数组可以容纳字符串值。那么,String类中是否有任何东西只能将字符串分配给名称数组,而我们不能将任何对象分配给名称数组?

Image[] images = new Image[3];
public class Image {

  /** Instance variables **/
  private String imgLoc;
  private String imgDesc;
  private int dimensionX;
  private int dimensionY;
  private boolean defaultImg;

  /** Getter method for image location **/
  public String getImgLoc() {
    return imgLoc;
  }

  /** Setter method for image location **/
  public void setImgLoc(String imgLoc) {
    this.imgLoc = imgLoc;
  }

  public String getImgDesc() {
    return imgDesc;
  }

  public void setImgDesc(String imgDesc) {
    this.imgDesc = imgDesc;
  }

  public int getDimensionX() {
    return dimensionX;
  }

  public void setDimensionX(int dimensionX) {
    this.dimensionX = dimensionX;
  }

  public int getDimensionY() {
    return dimensionY;
  }

  public void setDimensionY(int dimensionY) {
    this.dimensionY = dimensionY;
  }

  public boolean isDefaultImg() {
    return defaultImg;
  }

  public void setDefaultImg(boolean defaultImg) {
    this.defaultImg = defaultImg;
  }
}

3 个答案:

答案 0 :(得分:3)

  

为什么我不能为图像数组分配字符串或任何其他值?

Java类型系统禁止它。用类型Image[]声明的数组只能保存Image实例的对象,或者Image的子类型的实例(或null值)的对象。编译器将阻止您这样做。

这就是说Java是静态类型语言的意思。

此外,运行时系统的设计使其无法“破坏”数组的静态键入规则。例如,如果尝试使用反射将String放入Image[]中,则会立即遇到异常。

这就是说Java是强类型语言的意思。

(泛型类型和不安全的转换有一些问题,但是即使您犯了错,最糟糕的情况可能是某些隐藏的类型转换可能在意想不到的地方导致异常。)

(实际上破坏类型系统的唯一方法是走出Java语言;例如,通过使用本机代码或Unsafe类。但是,如果这样做,很可能会使JVM不稳定,导致JVM崩溃。)

  

对于String [] names = new String[3],names数组可以容纳字符串值。那么,String类中是否有任何东西只能将字符串分配给名称数组,而我们不能将任何对象分配给名称数组?

好的。类型系统。这种情况与您使用Image数组的示例相同。

但是请注意,不是String类正在执行此操作……除了Stringfinal类之外,因此String的子类型是不可能的

答案 1 :(得分:-1)

数组的类型决定了您可以在其中放置什么。 Java是statically typed language

答案 2 :(得分:-1)

在String类中没有任何内容arrays就是这样的。

Type[] array;仅接受Type实例或Type的子类实例

ex代表子类型

Number[]array = new Number[5];
array[0] = 5;    //int
array[1] = 5.0f; //float
array[2] = 5.0d; // double

如果您想使用所有功能:Object[]