【问题标题】:Array of different class objects in javajava中不同类对象的数组
【发布时间】:2015-08-31 20:26:01
【问题描述】:

我正在尝试创建一个不同对象的数组并为各个对象调用类方法。

class A
{
    int ID,
    String name,
    public int getID()
    {
        return ID;
    }
    public void setID(int id
    {
        ID = id;
    }
}
class B extends A
{
    string name;
    public string getName()
    {
        return name;
    }
    public void setName(string n)
    { 
        name = n;
    }
}
class Implement
{
    public static void main(string[] args)
    {
        A[] a1 = new A[2];
        a1[0] = new B();
        a1[1] = new B();
        a1[0].setID(123);
        a1[0].setName("John"); //Error
    }
}

我无法访问 B 类方法。任何人都可以帮助我理解为什么它不允许我访问以及如何实现这一点...感谢您的帮助.. 谢谢

【问题讨论】:

    标签: java inheritance polymorphism


    【解决方案1】:

    setID 不同,A 没有setName 方法,因此该方法没有多态性。

    【讨论】:

    • 感谢您的宝贵时间。现在我明白了。
    【解决方案2】:

    这是因为a[0] 的引用类型是parent class A,其中方法setName 未定义。为了能够调用setname,您可以将a[0] 转换为B

    【讨论】:

      【解决方案3】:

      您的代码中有几个语法错误。此外,您正在创建类型为A 的数组,而setName 的类型为B。这是更新的代码:

      class A
      {
          int ID;
          String name;
          public int getID()
          {
              return ID;
          }
          public void setID(int id)
          {
              ID = id;
          }
      }
      class B extends A
      {
          String name;
          public String getName()
          {
              return name;
          }
          public void setName(String n)
          { 
              name = n;
          }
      }
      class Implement
      {
          public static void main(String[] args)
          {
              B[] a1 = new B[2];
              a1[0] = new B();
              a1[1] = new B();
              a1[0].setID(123);
              a1[0].setName("John");
          }
      }
      

      【讨论】:

        【解决方案4】:

        复制您的代码,而不是重新输入。这里有很多错别字。 使用这个:

        class Implement
        {
             public static void main(String[] args)
             {
                A[] a1 = new A[2];
                a1[0] = new B();
                a1[1] = new B();
                a1[0].setID(123);
                ((B)a1[0]).setName("John"); //No error
              }
        }
        

        【讨论】:

          【解决方案5】:

          因为编译器认为列表中的每一项“都是”A,因为您将 a1 声明为 A 的列表。您只能调用属于 A 的方法。假设列表的第 3 项是 A 类型,那么你永远无法调用 setName() 。现在,如果您确定列表中的第一项是 B,则可以转换它:

          ((B)a1[0]).setName("name");
          

          如果你真的想使用多态,你需要在父类(A)上定义 setName()。然后,所有的孩子都可以重新定义 setName() 的作用。

          【讨论】:

          • 感谢您的回复。现在我明白了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-18
          • 1970-01-01
          • 1970-01-01
          • 2014-07-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多