试图了解如何覆盖方法/变量

时间:2013-03-30 01:50:03

标签: java

因此,在深入了解课程之前,我正试图理解压倒一切。我看过TheNewBoston(巴基)解释压倒一切,但我不确定我是否正确行事。有人请点击检查我并让我走上正确的道路吗?

我不记得Bucky必须在他的超类中保护他的任何实例变量。但是当我构建我的子类时,eclipse让我将我的实例变量转换为protected。

超级联系人:

public class Contacts
{
    protected String fname;
    protected String lname;
    protected String email;
    protected String phone;

    public Contacts(String fname, String lname, String email, String phone)
    {
        this.fname=fname;
        this.lname=lname;
        this.email=email;
        this.phone=phone;

    }

    public String getfname()
    {
        return fname;
    }

    public void setfname(String first)
    {
        this.fname=first;       
    }

    public String getlname()
    {
        return lname;
    }

    public void setlname(String last)
    {
        this.lname=last;
    }

    public String getemail()
    {
        return email;
    }

    public void setemail(String e)
    {
        this.email=e;
    }

    public String getphone()
    {
        return phone;
    }

    public void setphone(String num)
    {
        this.phone=num;
    }

    public String getFullName()
    {
        String full=fname+" "+lname;
        return full;
    }

子类朋友:

public class Friend extends Contacts
{
    private String dob;


    public Friend(String fname, String lname, String email, String phone)
    {
        super(fname, lname, email, phone);
    }


    public String getDob()
    {
        return dob;
    }


    public void setDob(String dob)
    {
        this.dob = dob;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString()
    {
        return fname+", "+lname+", "+email+", "+phone+", "+dob;
    }




}

子类BusinessAssociate:

public class BusinessAssociate extends Contacts
{
    private String title;
    private String position;
    private String company;
    private String full;

    public BusinessAssociate(String fname, String lname, String email,
            String phone)
    {
        super(fname, lname, email, phone);

    }

    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title=title;
    }

    public String getCompany()
    {
        return company;
    }

    public void setCompany(String company)
    {
        this.company=company;
    }

    public String getPosition()
    {
        return position;
    }

    public void setPosition(String position)
    {
        this.position=position;
    }

    /* (non-Javadoc)
     * @see Contacts#getFullName()
     */
    @Override
    public String getFullName()
    {
        full=title+" "+fname+" "+lname;
        return full;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString()
    {
        return full+", "+email+", "+phone+", "+company+", "+position;
    }




}

1 个答案:

答案 0 :(得分:2)

代码中的覆盖对我来说是正确的。

但请注意,您只能覆盖实例方法。 的构造函数,字段和静态方法不能被覆盖

评论问:

  

“字段不能被覆盖”是什么意思?这看起来像是对我的覆盖:

    class A { protected int a = 1; } 
    class B extends A { protected int a = 2; }`. 
     

你能澄清一下吗?

这不是一个覆盖。你在这里有一个子类B中的一个字段,隐藏超类A中的字段。如果您创建B的实例,则会有两个不同的a字段,这些字段具有不同的值。

参考:https://stackoverflow.com/a/11971061/139985


  

...但为什么eclipse让我把构造函数放在每个子类中。在youtube视频中不是这样。

因为Eclipse实现了JLS,而JLS需要它。据推测,YouTube视频中的示例有所不同。

您的示例的设计方式,基类Contacts具有子类共有/使用的字段,并且(自然地)在其构造函数中初始化这些字段。您不会(也不应该)在Contacts中使用no-args构造函数,因为这样可以让人们创建具有Constants名称,电子邮件和电话字段的无用null个实例。

但是,Contacts没有no-args构造函数这一事实意味着任何子类都需要显式的构造函数声明。 Java工作的方式,如果你没有声明任何构造函数,类就会得到一个默认的no-args构造函数。但是,只有当超类具有no0args构造函数时,才能使用该默认构造函数。在这种情况下,它没有。

所以Eclipse坚持你的子类声明构造函数是正确的。 Java编译器也很乐意为Contacts添加no-args构造函数。但这将是错误的解决方案,因为它会导致使用BusinessAssociate字段创建Friendnull个实例。


  

但是当我构建我的子类时,eclipse让我将我的实例变量转换为protected。

为什么会发生这种情况并不完全清楚('我们之前不知道你们有什么!!)但是如果你的子类直接引用超类的字段,那么超类字段必须具有正确的“访问权限”允许这样的修饰符。 (例如,子类不能直接引用超类private字段.Java语言规范禁止这样做。)