Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Oop - Fatal编程技术网

Java 是否可以在超类类型的数组中包含子类数组

Java 是否可以在超类类型的数组中包含子类数组,java,arrays,oop,Java,Arrays,Oop,假设有一个形状的超类,两个子类是正方形和三角形。 然后,人们可以制作一个包含正方形和三角形对象的类型形状数组吗? 如果是,那么这样做的最佳实践是什么 下面是我想知道的可能的例子: class shapes{ protected int linear_scale_factor = 4; } class square extends shapes { int area; int scaled_area = area * linear_scale_factor**2; }

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

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

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

}


像这样的东西不行,为什么?

您有两个类,它们是Shape类的子类。这两个类覆盖字段缩放区域。这意味着通过shapes\u arr对缩放区域的任何引用正在调用超类字段,该字段未指定任何值。此外,当存储在区域字段中的值为默认值(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);
        }
    }

}

对这是完全合法的,完全合法,而且是人们所期待的。你在设置上有问题吗?问题是如果我选择了该数组的一个元素,比如2,它是一个三角形,我无法访问它的属性,例如
shapes\u arr[2]。scaled\u area