Java расширяет пример

У меня есть вопрос для начинающих Java: Parent.print() печатает "Привет" в консоли, но также Child.print() печатает "Привет". Я думал, что это должно напечатать "ребенок". Как я могу решить это?

public class Parent {

    private String output = "hallo";

    public void print() {
        System.out.println(output);
    }

}

public class Child extends Parent {

   private String output = "child";

}

4 ответа

Решение

В настоящее время у вас есть две отдельные переменные, и код в Parent знает только о Parent.output, Вам необходимо установить значение Parent.output "ребенку". Например:

public class Parent {

  private String output = "hallo";

  protected void setOutput(String output) {
    this.output = output;
  }

  public void print() {
    System.out.println(output );
  }
}

public class Child extends Parent {
  public Child() {
    setOutput("child");
  }
}

Альтернативным подходом было бы дать классу Parent конструктор, который получил желаемый результат:

public class Parent {
  private String output;

  public Parent(String output) {
    this.output = output;
  }

  public Parent() {
    this("hallo");
  }

  public void print() {
    System.out.println(output );
  }
}

public class Child extends Parent {
  public Child() {
    super("child");
  }
}

Это действительно зависит от того, что вы хотите сделать.

Child не имеет доступа к Parent"s output переменная экземпляра, потому что это private, Что вам нужно сделать, это сделать это protected и в конструкторе Child задавать output в "child",

Другими словами, два output переменные разные.

Вы также можете сделать это, если вы измените вывод на protected в Parent:

public void print(){
    output = "child"
    super.print();
}

Причина, по которой child не печатает "child", заключается в том, что при наследовании в java наследуются только методы, а не поля. Переменная output не отменяется ребенком.

Вы можете сделать это так:

public class Parent {
    private String parentOutput = "hallo";

    String getOutput() {
        return output;
    }

    public void print() {
        System.out.println(getOutput());
    }
}

public class Child extends Parent {
    private String childOutput = "child";

    String getOutput() {
        return output;
    }
}

Кроме того, переменные String не обязательно должны иметь разные имена, но я сделал это здесь для ясности.

Другой, более читаемый способ сделать это:

public class Parent {
    protected String output;

    public Parent() {
        output = "hallo";
    }

    public void print() {
        System.out.println(output);
    }
}

public class Child extends Parent {
    public Child() {
        output = "child";
    }
}

В этом примере переменная protectedЭто означает, что его можно прочитать как от родителя, так и от ребенка. Конструктор классов устанавливает переменную в желаемое значение. Таким образом, вы реализуете функцию печати только один раз и не нуждаетесь в дублирующем переопределенном методе.

Когда я пытался выяснить ключевое слово extend, я использовал два класса. Я надеюсь, что это также поможет вам понять основную идею.

Parent.java

public class Parent {
    private int a1;
    private int b1;


    public Parent(int a, int b){
        this.a1 = a;
        this.b1 = b;
    }

    public void print() {
        System.out.println("a1= " + this.a1 + " b1= " + this.b1);
    }

}

Child.java

public class Child extends Parent {
        public Child(int c1, int d1){
        super(c1,d1);
    }

    public static void main(String[] args) {
        Parent pa = new Parent(1,2);
        pa.print();
        Child ch = new Child(5,6);
        ch.print();
    }

}
Другие вопросы по тегам