2017-04-18 94 views
2

任何人都可以解释我有什么原因让子类对象不能拥有超类构造函数吗?为什么不能让子类对象拥有超类构造函数

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()的可见性?

回答

3

这里没有什么令人吃惊:

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

你拨打的是在超类中定义的方法;并在一个子类中重写。你创建一个子类的实例;并且执行的方法...是被覆盖的版本。

是测试版包含另一方法是并不在您的示例中使用反正不来这里发挥作用,在所有的事实。即使getType1()将打电话acc() - 这仍然可以工作。那就是polymorphism本质

而只是为了精确:你们没有在你的类有方法constructor

+0

你能帮我理解什么是junit的功能和非功能需求请 –

+0

这是一个相当广泛的主题。你能多给一点情景吗?唯一没有进一步信息的情况下说:A)测试用例的功能要求是**验证**相应的生产代码。 B)非功能性需求......我会看到那些构成“良好”单元测试的“属性”;如[在此](http://artofunittesting.com/definition-of-a-unit-test/)所概述的。 – GhostCat

-1

这是一个方法重载的例子。在运行时解析对重载方法的实际调用。将调用哪个方法,取决于具体对象而不是对象的类型。这里你的参考是Alpha类型的,但是对象是类型Beta。所以方法getType1()这里将打印测试这是正确的行为。

其他说明:儿童始终可以访问父类的默认构造函数,直到除非你有通过使限制它,它的私人

+2

编辑答案比编辑问题要少得多,特别是当编辑*显着改变答案*时。通常的做法是写评论,要求作者纠正他们的问题,或者假定他们不知道他们在谈论什么和下调他们的意见。 – RealSkeptic

0

我刚刚找到了答案在这里,我们需要知道,当我们创建测试()在内部它会调用所有的超类的默认构造函数因此JVM知道有一个以上的现有类,但是当我宣布和initialze,如:

Alpha a1=new Beta(); 

eventhough的JVM知道测试类是现有的,但你限制你的访问a1通过说它是Alpha类的类型,因此它不能访问你的子类方法。

相关问题