为什么cant子类对象拥有超类构造函数

时间:2017-04-18 10:24:26

标签: java superclass

有人能解释一下,子类对象无法容纳超类构造函数的原因是什么?

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&#34 ;;但是对象a1没有acc()的可见性?

4 个答案:

答案 0 :(得分:3)

这里没什么可惊讶的:

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

您正在调用超类中定义的方法;并在子类中重写。您创建子类的实例;并且执行的方法是被覆盖的版本。

Beta包含另一种方法的事实,无论如何根本不是 这个方法根本不会在这里发挥作用。即使getType1()会调用acc() - 这仍然可行。这是polymorphism本质

准确地说: constructor {{3}}

答案 1 :(得分:0)

我刚刚在这里找到答案我们需要知道,当我们在内部创建beta()时,它将调用其所有超类默认构造函数,因此JVM知道存在多个现有类,但是当我声明并初始化时:

 Alpha a1=new Beta();

虽然JVM知道beta类已经存在但是你通过说它是Alpha类的类来限制你对a1的访问,因此它无法访问你的子类方法。

答案 2 :(得分:0)

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

如果您不需要创建超类的对象,那么您可以将类声明为抽象类,然后您可以简单地将该方法作为抽象关键字,如下所示。

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());
 }

答案 3 :(得分:-1)

除非您使用私有访问修饰符限制子类,否则子类有权访问父类的默认构造函数。

您的案例是方法重载的一个示例。实际调用重载方法在运行时解决。将调用哪种方法,取决于具体对象而不是对象类型。这里您的引用是Alpha类型,但对象是Beta类型。因此,方法{{1}}会打印出正确行为的beta。