【问题标题】:How to call a Subclass as a Superclass Type如何将子类称为超类类型
【发布时间】:2014-09-27 04:40:59
【问题描述】:

我目前正在学习继承,但在理解这个概念时遇到了一些麻烦。 对于下面的代码,有人能告诉我为什么我不能声明 Superclass 类型的子类吗?

public class Test{
    public static void main(String[] args){
    Superclass myA = new Superclass();
    Superclass myB = new Subclass();
    }
public class Superclass{
    private string a;

    public Superclass()
    {
        a="";
    }
    public void setA(String userA)
    {
        a = userA;     
    }
}
public class Subclass extends Superclass{
    private String b;

    public Subclass()
    {
        b = "";
    }
    public void setB(String userB)
    {
        b = userB;
    }
    public void display()
    {
        System.out.print(b)
    }
}

myA 不会给我任何问题,但 myB 会。我想做一系列让我们说超类, 但我希望能够使用子类。像这样的东西

Superclass[] X = new Superclass[2];
x[0] = new Subclass();
X[0].setB("hello");
X[0].display();

【问题讨论】:

    标签: java superclass


    【解决方案1】:

    您正在将子类对象分配给超类类型变量(即,向上转换已完成),这很好。 但是当你这样做时,只能访问超类方法。因此,为了访问子类方法,请对其子类类型进行向下转换。 例如。

        Superclass[] X = new Superclass[2];
        X[0] = new Subclass();
        ((Subclass) X[0]).setB("hello");
        ((Subclass) X[0]).display();
    

    【讨论】:

      【解决方案2】:

      这里的主要乐趣在于,每当您在引用上调用任何方法时,该方法都应该出现在其类声明中。

      方法是否可以调用由引用类型决定,但调用哪个实现实例取决于其对象类型。

      因为你在SuperClass 中没有setB() 方法,编译器不知道这个方法来自哪里,所以它给出了编译时错误。

      希望对你有帮助!

      【讨论】:

        【解决方案3】:

        将您的子类中的setB() 重命名为setA(),将函数display() 添加到您的超类中,并在您的子类上将setA() 调用为X[0].setA("hello");,您将看到这是如何工作的。

        【讨论】:

          【解决方案4】:

          像这样更改您的代码 - 将 setA() 和 setB() 更改为 set() - 您的代码将正常工作。这种行为称为多态,是面向对象编程的主要概念之一。

          public class Superclass{
              private string a;
          
              public Superclass()
              {
                  a="";
              }
              public void set(String userA)
              {
                  a = userA;     
              }
          }
          public class Subclass extends Superclass{
              private String b;
          
              public Subclass()
              {
                  b = "";
              }
              @override
              public void set(String userB)
              {
                  b = userB;
              }
              public void display()
              {
                  System.out.print(b)
              }
          }
          

          【讨论】:

            【解决方案5】:

            您正在尝试将一个子类类型对象分配给它的超类类型对象 X[0]。

            所以它在分配它时不会显示任何错误。但是你可以在子类中调用那些与超类同名的方法。

            例如

            如果你重命名 setB()setA(),你可以找到你的预期结果,但你不能调用 setB()

            现在尝试分配 myB=X[0]; 并运行

            你会得到这个错误:线程“main”java.lang.NullPointerException中的异常

            现在,如果您创建一个新的子类对象,即子类 subc=new Subclass();

            并尝试将 X[0] 分配给 subc,subc=X[0]; 你会得到这个错误,不兼容的类型(需要子类,找到超类)

            【讨论】:

              【解决方案6】:

              您的 X 变量是 Superclass 类型,因此您只能访问此类或其超类(超类的超类但不是其子类)中的可见方法和属性。 您认为可以调用setB() 方法的问题在于,您看到分配给Superclass[] X 的对象类型是新的Superclass[2],所以当您获得对这样一个对象的引用作为属性时会发生什么一个方法?你甚至不知道它的调用者,如果它甚至有子类,你可以猜测和调用它的子类的哪些方法? 你不能

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-05-09
                • 1970-01-01
                • 2018-12-28
                • 1970-01-01
                • 1970-01-01
                • 2013-08-12
                • 2013-10-17
                相关资源
                最近更新 更多