java声明与初始化

时间:2017-11-06 00:36:59

标签: java class oop

我熟悉编程,但我正在学习Java。为什么在Java中说

是可以的
public void actionPerformed(ActionEvent e)
{          
        JTextField[] fileField = new JTextField[inputBox.getSelectedIndex()];
        JLabel[] fieldLabel = new JLabel[inputBox.getSelectedIndex()];
        for(int i = 0; i < fileField.length; i++)
        {
            fieldLabel[i].setText("File "+i+":");  //NULL POINTER EXCEPTION HERE
            fieldPanel.add(fieldLabel[i]);         //NULL POINTER EXCEPTION HERE
            fieldPanel.add(fileField[i]);
        }
        centerPanel.add(fieldPanel);
        repaint();
        revalidate();
}

其中A与B不同(显然)。我知道A test = new B() 部分只是调用B类的初始化方法。令我困惑的是你为什么要这样做? new B()是否在计算机内存中创建了对象,初始化为A?

这个问题与接口无关。为什么这被标记为重复我不知道...

1 个答案:

答案 0 :(得分:0)

  1. A test部分声明您有一个名为test的变量,其类型为A
  2. =部分表示您将左侧的test设置为右侧的内容。
  3. new B()部分意味着在内存中创建类型为B的新对象。
  4. 因此,在内存中创建对象的唯一部分是第3部分new B()。为了更清楚地看到这一点,你也可以这样做:

    A test = existingObject;
    

    在这种情况下,没有创建新对象。 test被分配了一个已经存在于内存中的对象,因此您的示例中的new B()创建了该对象。

    就为变量分配不同类型的对象而言,对象必须是变量类型的子类(或实现)。因此,如果BA的子类(或实现),则A test = new B();将正常工作。

    使用变量test时,只有为类(或接口)A定义的方法才适合您。您必须将其重新分配给B类型的变量才能访问B特有的方法。