因此,在深入了解课程之前,我正试图理解压倒一切。我看过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;
}
}
答案 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
字段创建Friend
和null
个实例。
但是当我构建我的子类时,eclipse让我将我的实例变量转换为protected。
为什么会发生这种情况并不完全清楚('我们之前不知道你们有什么!!)但是如果你的子类直接引用超类的字段,那么超类字段必须具有正确的“访问权限”允许这样的修饰符。 (例如,子类不能直接引用超类private
字段.Java语言规范禁止这样做。)