有人能解释一下,子类对象无法容纳超类构造函数的原因是什么?
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()的可见性?
答案 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。