动物基类
public class Animal
{
protected String pig;
protected String dog;
protected String cat;
public void setPig(String pig_)
{
pig=pig_;
}
public void setCat(String cat_)
{
cat=cat_;
}
public void setDog(String dog_)
{
dog=dog_;
}
}
AnimalAction类
public class AnimalAction extends Animal
{
public AnimalAction(String pig, String cat, String dog)
{
super.pig = pig;
super.cat = cat;
super.dog = dog;
}
}
这是设置受保护变量的正确方法吗?使用受保护的变量是否正确?是否有更专业的OO方式?
答案 0 :(得分:2)
您可以使用私有变量而不是受保护。这样会更贴切。 您可以使用构造函数来设置超类的值。 编辑:
public class Animal{
private String pig;
private String dog;
private String cat;
public Animal(String pig,String dog,String cat){
this.pig=pig;
this.dog=dog;
this.cat=cat;
}
}
public class AnimalAction extends Animal
{
public AnimalAction(String pig, String cat, String dog)
{
super(pig,dog,cat);
}
}
答案 1 :(得分:0)
您应该能够使用this.pig
等,因为您继承了受保护的成员。您实际上也可以调用public setPig(...)
方法。
答案 2 :(得分:0)
无需使用super
前缀或任何其他前缀来访问受保护的变量。
"设计继承或禁止它的原则"约书亚布洛赫在Effective Java book中解释了这一点。
答案 3 :(得分:0)
使用protected
成员变量然后在子类中继承它们没有错。
但是如果一个开发人员出现并将你的类子类化,他们可能会搞砸它,因为他们不完全理解它。对于除公共界面之外的私有成员,他们无法看到实现方式的实现具体细节,这使您可以灵活地在以后更改它。
通过提供protected member variables
,您只是在子类和超类之间紧密耦合。
答案 4 :(得分:0)
在课堂外可以看到的成员变量越少越好。我会创建类变量private
并将getters公开(或根据需要)&塞特人受到保护。
答案 5 :(得分:0)
你的例子很混乱,但它会起作用。我再给出一个例子:
//对类/接口/枚举使用大写,为方法/字段使用小写。
public class Animal
{
protected String name;
protected int numberOfFeet;
public Animal(String name)
{
this.name = name;
}
public void setNumberOfFeet(int numberOfFeet)
{
this.numberOfFeet = numberOfFeet;
}
}
public class Dog extends Animal
{
public Dog()
{
super("dog"); // call the constructor of the super class.
// because Dog extends Animal and numberOfFeet is protected, numberOfFeet becomes part of "this" class.
this.numberOfFeet = 4;
}
}
//Now you can create instances of Animal like:
Animal bird = new Animal("bird");
bird.setNumberOfFeet(2);
//Or use Dog to create an animal "dog" with 4 feet.
Animal dog = new Dog();
//after an accident
dog.setNumberOfFeet(3);