2013-02-10 81 views
0

当我将此代码更改为Member m1 = new Member();它完美地工作。为什么它不适用于超类参考?请有人解释一下吗?Java继承

public class Family { 

String Surname = "Richard"; 
String Address = "No:10, High Street,Colombo"; 

} 

public class Member extends Family{ 

String Name; 
int age; 

public void Details() { 
    System.out.println("full Name ="+ Name +" "+ Surname); 
    System.out.println("Age =" +age); 
    System.out.println("Address =" + Address); 
} 

public static void main(String[] args) { 
    Member m1 = new Family(); 

    m1.Name="Anne"; 
    m1.age=24; 

    m1.Details(); 

} 
+1

[this]的可能重复(http://stackoverflow.com/questions/14790445/java-inheritance-cannot-find-method-to-invoke-on-object/14790491#14790491) – 2013-02-10 07:04:43

回答

7

您没有超类参考。您有一个持有对超类对象的引用的子类引用,这是非法的。其次,如果你想看到多态性的效果,你需要在超类的子类中定义你所拥有的方法。您只能在超级类引用上调用该方法,这也是在超级类中定义的。

所以,你基本上需要这样的: -

Family m1 = new Member(); 

然后定义(是的,方法名应该以小写字母开头),在你的Family类的details()方法。

现在,当您尝试访问Member的字段时,您将收到另一个编译器错误。为此,最好在Member类使用2参数的构造函数,并从该构造函数,调用2 ARG超级构造(你需要明确地做到这一点),或0 ARG超级构造(这是隐含的)

public Member(String name, int age) { 
    this.name = name; 
    this.age = age; 
} 

并使用此构造函数来创建对象。它会隐含地调用0-arg超级构造函数来用它们的默认值初始化它的字段。如果你想给它们一个值,你可以在Member类中使用4参数构造函数,传递超类字段的2参数,然后从那里调用超类2参数构造函数

我认为,你应该从一个很好的教程开始,首先学习一般的继承,访问说明符,然后继续使用多态。

+0

+1 for answer plus关于方法命名的建议。 – xyz 2013-02-10 07:06:00