有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

oop Java扩展类和设置值

动物基类

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_;
}

}

动物活动类

public class AnimalAction extends Animal
{
  public AnimalAction(String pig, String cat, String dog)
  {
       super.pig = pig;
       super.cat = cat;
       super.dog = dog;
  }

}

这是设置受保护变量的正确方法吗?使用受保护变量是正确的方法吗?有没有更专业的OO方法


共 (6) 个答案

  1. # 1 楼答案

    使用protected成员变量并在子类中继承它们并没有什么错

    但是,如果一个开发人员出现并对你的类进行子类化,他们可能会把它搞砸,因为他们不完全理解它。对于私有成员,除了公共接口之外,他们看不到具体实现的细节,也看不到如何进行操作,这给了您以后更改它的灵活性。 通过提供protected member variables,您只是在子类和超类之间紧密耦合

  2. # 2 楼答案

    在课堂外看到的成员变量越少越好。我会将类变量private公开(或根据需要公开)&;二传手受到保护

  3. # 3 楼答案

    可以使用私有变量而不是受保护的变量。这会更合适。 可以使用构造函数设置超类的值。 编辑:

    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);
      } 
    
    }
    
  4. # 4 楼答案

    你的例子很让人困惑,但它会起作用。我再举一个例子:

    //类/接口/枚举使用大写字母,方法/字段使用小写字母

    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);
    
  5. # 5 楼答案

    无需使用super前缀或任何其他前缀来访问受保护的变量

    顺便说一句——有一点我不同意托马斯的观点——不要在构造函数中调用超类的setter方法。如果子类重写了构造函数中的非最终设置器,那么在构造函数中使用非最终设置器可能会产生不好的效果。然后可以对一个未完全构造的对象调用它们。但是你应该考虑让你的设定者最终,如果你不意味着他们被重写。

    约书亚·布洛赫(Joshua Bloch)在Effective Java book中解释了“为继承而设计或禁止继承”的原则

  6. # 6 楼答案

    您应该能够使用this.pig等,因为您继承了受保护的成员。实际上,您也可以调用public setPig(...)方法