Java新生,有有关问题

Java新生,有问题
public class Quardrangle{
private Quardrangle[] qtest = new Quardrangle[6];
private int nextIndex = 0;
public void draw(Quardrangle q){
if (nextIndex < qtest.length){     // ①
qtest [nextIndex] = q;    // ②
System.out.println(nextIndex);
nextIndex++;
}
}
public static void main(String[] args){
Quardrangle q= new Quardrangle();
q.draw(new Sqare());      //③
q.draw(new Paralleogramgle());
}
}
class Sqare extends Quardrangle{
public Sqare(){
System.out.println("正方形");
}
}
class Paralleogramgle extends Quardrangle{
public Paralleogramgle(){
System.out.println("平行四边形");
}
}


麻烦大家给看一下,我标出来123的三句话什么意思?  尤其是③ 把对象作为参数是怎么用的? ①②中的比较有什么意义?
看了半个小时了  一点都看不懂
------解决方案--------------------
1.比较是防止数组越界;遍历数组,不能超过数组的大小,即数组中有5个元素,那么就限制你不能去第6个元素。
 qtest [nextIndex] = q;    // ②

2.这个的意思是 qtest [0] = q;    // ②   即把数组中的第一个元素的值赋为q
3.就是qtest [0]=new Sqare()
------解决方案--------------------
建议你去看看java基础    方法参数

程序执行是从main方法开始的
也就是这里:
    public static void main(String[] args){
        Quardrangle q= new Quardrangle();
        q.draw(new Sqare());      //③
        q.draw(new Paralleogramgle());
    }

第一句Quardrangle q= new Quardrangle();是创建了Quardrangle的对象q。

第二句q.draw(new Sqare());
q调用draw方法
其中传入的参数是一个创建出来的 Sqare对象(Sqare是Quardrangle的子类,所以可以进行参数传递)
程序再进行q.draw(new Sqare()) 的时候,首先执行的是  new Sqare()
Sqare类设置了无参数的构造方法。
 就是:
public Sqare(){
        System.out.println("正方形");
    }
所以控制台会首先输出一个字符串:正方形
然后调用对象q的draw方法
执行
if (nextIndex < qtest.length){     // ①
            qtest [nextIndex] = q;    // ②
            System.out.println(nextIndex);
            nextIndex++;
        }
nextIndex设置的是0  qtest.length是数组的长度(值是6)
执行if语句内的内容
qtest [nextIndex] = q;   表示将q对象的属性qtest赋值,使qtest[0] = q;
System.out.println(nextIndex); 表示输出nextIndex的值
控制台输出0
继续执行nextIndex++;
q对象的属性nextIndex的值变成1。
然后执行q.draw(new Paralleogramgle());
因为Paralleogramgle同样是Quardrangle的子类
并且Paralleogramgle类中设置了构造方法
所以同样控制台输出:平行四边形
这时候q对象中的nextIndex属性的值是1
所以
if (nextIndex < qtest.length){     // ①
            qtest [nextIndex] = q;    // ②
            System.out.println(nextIndex);
            nextIndex++;
        }
qtest[1] = q;  
q中的属性qtest数组被赋值
System.out.println(nextIndex);
输出1
nextIndex++;
nextIndex的值变成2.


------解决方案--------------------
引用:
Quote: 引用:

1.比较是防止数组越界;遍历数组,不能超过数组的大小,即数组中有5个元素,那么就限制你不能去第6个元素。
 qtest [nextIndex] = q;    // ②

2.这个的意思是 qtest [0] = q;    // ②   即把数组中的第一个元素的值赋为q
3.就是qtest [0]=new Sqare()
  qtest [0]=new Sqare()这句话,对象怎么赋给数组? 他也不是值之类的。 还有 qtest [0]=new Sqare(),这样把Sqare()赋给了qtest[0], Sqare方法就会同时执行吗?  

此处定义的数组为对象数组。数组的类型为Quardrangle,数组的大小为6,即给数组可以存储6个Quardrangle的对象。这个定义和一个int型数组是一样,int型数组放入的值都是int型的,以此类推,你将int变为Quardrangle就是这里定义的数组。这里还存在一个对象的向上转型。数组可以存入的Sqare对象,是因为Sqare 是Quardrangle子类,也即发生了多态。而程序中打印的“正方形”是因为Sqare类中重写了构造方法,创建一个新的对象,系统都会自动调用该类的构造方法。