为什么 subclass 对象不能容纳 super class 构造函数

why cant subclass objects hold super class constructor

谁能解释一下子 class 对象不能容纳超级 class 构造函数的原因是什么?

class Alpha 
{
   String getType1() 
   {
      return "alpha";
    }
}

class Beta extends Alpha 
{
   String getType1() 
   {
      return "beta";
   }
   String acc()
   {
      return "acc"; 
   }
}

public static void main(String[] args)
{
   Alpha a1=new Beta();
   System.out.println(a1.getType1());
 }

这里的输出是"beta";但对象 a1 对 acc() 不可见?

这里没什么奇怪的:

System.out.println(a1.getType1());

您正在调用一个在 super class 中定义的方法;并在 a subclass 中被覆盖。您创建了 subclass; 的一个实例;并且执行的方法...是覆盖版本。

事实上,Beta 包含 另一个 方法根本没有 在你的例子中无论如何都没有在这里发挥作用全部。即使 getType1() 会调用 acc() - 这仍然有效。那就是polymorphism!

本质

准确地说:none 您在 classes 中使用的方法是 constructor!

Child classes 有权访问 parent class 的默认构造函数,除非您使用私有访问修饰符对其进行限制。

您的案例是方法重载的一个例子。对重载方法的实际调用在 运行 时解决。将调用哪个方法取决于具体 object 而不是 object 的类型。此处您的引用是 Alpha 类型,但 object 是 Beta 类型。所以这里的方法 getType1() 将打印 beta,这是正确的行为。

我刚刚在这里找到了答案,我们需要知道当我们在内部创建 beta() 时,它会调用它所有的超级 class 默认构造函数,因此 JVM 知道存在不止一个 class 但是当我像这样声明和初始化时:

 Alpha a1=new Beta();

尽管 JVM 知道 beta class 存在,但您通过说它是 Alpha class 类型来限制您对 a1 的访问,因此它无法访问您的 subclass 方法.

当您创建子对象 class 并像您一样引用其父对象 class 时,您只能对属于父对象 class 的那些方法可见。但是如果你想使用父 class 的引用调用子方法,那么你必须在子 class 中的父 class 中声明方法的主体。那么它将是可见的,这个概念称为方法覆盖。

如果你不需要创建你的 super class 的对象,那么你可以将 class 声明为抽象的,然后你可以简单地将那个方法作为 abstract 关键字,如下所示。

abstract class Alpha 
{
   String getType1() 
   {
      return "alpha";
    }

   abstract String acc();
   
}

class Beta extends Alpha 
{
   String getType1() 
   {
      return "beta";
   }

   @Overriding
   String acc()
   {
      return "acc"; 
   }
}

public static void main(String[] args)
{
   Alpha a1=new Beta();
   System.out.println(a1.getType1());
 }