我是第一年参加OOP的IT学生......
我有这个抽象的父类......
public abstract class Person{
private String Name;
protected Person(){
setName("xxxxxxxx");
}
public abstract String getName();
public abstract void setName(String name);
}
这是它的子类......
public class PetOwner extends Person{
private boolean hasKids;
private boolean hasAllergies;
public PetOwner(){
setName("xxxx");
setAllergies(true);
setKids(true);
}
public PetOwner(String name, boolean a, boolean k){
setName(name);
setKids(k);
setAllergies(a);
}
public String getName(){return Name;}
public void setName(String n){ Name = n;}
public boolean getAllergies(){return hasAllergies;}
public void setAllergies(boolean a){hasAllergies = a;}
public boolean getKids(){return hasKids;}
public boolean setKids(boolean k){hasKids = k;}
}
当我编译子类时,它的错误是" Name"是Person的私有变量。
我的问题是如何通过不将其更改为public或protected来访问子类中父类的私有变量?
答案 0 :(得分:2)
public String getName(){return Name;} public void setName(String name){Name = name;}
public String getName(){return super.getName();} public void setName(String n){ super.setName(n);}
另一个注意事项:您没有在超类构造函数中为Name赋值。写Name = xxxx,因为你正在调用一个抽象的setter!
答案 1 :(得分:0)
private
成员对于定义它们的实体是私有的。protected
对于它们被定义的实体及其子类是私有的。 public
表示无处可见/无法访问。
粗略地说,如果在给定实体中定义属性,那么几乎所有的管理都应该在同一个地方定义。这意味着如果Person
有name
,那么方法setName
和getName
应该在Person
中定义。它们可以在子类中重新定义,但它们至少应该在Person
中定义。
考虑一下:为什么您希望(通常情况下)每个PetOwner
或ClergyMan
定义setName
?他们可能都会完全一样;所以在Person
中分析定义是正确的方法。