【问题标题】:is it possible to have an array of subclasses in an array of type superclass是否可以在超类类型的数组中包含子类数组
【发布时间】:2020-06-29 01:01:36
【问题描述】:

假设一个有一个超类的形状,两个子类是正方形和三角形。 然后可以制作一个包含正方形和三角形对象的类型形状数组吗? 如果是这样,这样做的最佳做法是什么?

下面我想知道的例子是可能的:

class shapes{
    protected int linear_scale_factor = 4;
}

class square extends shapes {
    int area;
    int scaled_area = area * linear_scale_factor**2;
}

class triangle extends shapes {
   int area;
   int scaled_area = area * linear_scale_factor**2;

}

class main{
   shapes[] shapes_arr = new shapes[8];
   shapes_arr[0] = new square(34);
}

编辑

class shapes{
    protected int linear_scale_factor = 4;
    protected int scaled_area ;
}

class square extends shapes {
    int area;
    int scaled_area = area * linear_scale_factor*linear_scale_factor;
    
    public square(int i){
        area = i;
    }
}

class triangle extends shapes {
   int area;
   int scaled_area = area * linear_scale_factor*linear_scale_factor;

   public triangle(int i){
       area = i;
   }

}

class main{
    public static void main(String[] args) {
        shapes[] shapes_arr = new shapes[8];
        shapes_arr[0] = new square(34);
        shapes_arr[1] = new triangle(12);
        shapes_arr[2] = new square(453);


        for(shapes shape : shapes_arr){
            System.out.println(shape.scaled_area);
        }
    }

}

这样的东西不起作用,为什么?

【问题讨论】:

  • 是的。这将是完全合法的。
  • 这是完全合法的,也是意料之中的。您在设置时遇到问题吗?
  • 问题是如果我选择该数组的一个元素,比如 2 和它的三角形,我将无法访问其属性,例如 shapes_arr[2].scaled_area

标签: java arrays oop


【解决方案1】:

您有两个类是 Shape 类的子类。这两个类会覆盖 scaled_area 字段。这意味着通过 shapes_arr 对 scaled_area 的任何引用正在调用尚未分配任何值的超类字段。此外,当存储在字段 area 中的值是默认值(0 表示 int)时,您在声明期间计算 scale_area 的值。这是一个可行的重新排列:

class shapes{
    protected int linear_scale_factor = 4;
    protected int scaled_area ;
}

class square extends shapes {
    int area;
    public square(int i){
        area = i;
        scaled_area = area * linear_scale_factor*linear_scale_factor;
    }
}

class triangle extends shapes {
   int area;
   

   public triangle(int i){
       area = i;
       scaled_area = area * linear_scale_factor*linear_scale_factor;
   }

}

class main{
    public static void main(String[] args) {
        shapes[] shapes_arr = new shapes[8];
        shapes_arr[0] = new square(34);
        shapes_arr[1] = new triangle(12);
        shapes_arr[2] = new square(453);


        for(shapes shape : shapes_arr){
            System.out.println(shape.scaled_area);
        }
    }

}

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2011-06-09
    • 2017-09-14
    • 2014-10-18
    • 2013-11-06
    • 1970-01-01
    相关资源
    最近更新 更多