任何人都可以向我解释子类对象无法持有超级类构造函数的原因是什么?
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没有可见性((?
这里没什么惊讶的:
System.out.println(a1.getType1());
您正在调用一个在超级类中定义的方法;并在一个子类中覆盖。您创建一个子类的实例;而执行的方法是覆盖版本。
Beta包含的事实,它是> 根本不使用的的方法。即使getType1()
会调用acc()
-仍然可以正常工作。那是多态性的 Essence !
和确切地说:您在类中使用的方法的无是构造函数!
我刚刚在这里找到答案,我们需要知道,当我们内部创建beta((时,它将称呼其所有超级类默认构造函数,因此JVM知道有多个现有类但是,当我声明和初始启动时:
Alpha a1=new Beta();
事件尽管JVM知道Beta类已存在,但是您通过说这是Alpha类的限制了A1的访问,因此它无法访问您的子类方法。
创建一个孩子类的对象,像您一样对父母进行引用时,您只能看到属于父类的方法。但是,如果您想使用父级的引用来调用子方法,则必须在子类中所拥有的父类中的方法声明。然后它将可见,此概念称为方法覆盖。
如果您不需要创建超级类的对象,则可以将类声明为抽象,然后您可以将该方法简单地将其列为如下所示的抽象关键字。
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());
}
儿童类有特权访问父类的默认构造函数,除非您已使用私人访问修饰符限制了它。
您的案例是方法过载的一个示例。在运行时解决了对超载方法的实际调用。将调用哪种方法,取决于混凝土对象而不是对象的类型。在这里,您的引用是类型alpha,但该对象是类型的beta。因此,方法getType1()
在这里将打印beta,这是正确的行为。