Java расширяет пример - PullRequest
8 голосов
/ 15 ноября 2010

У меня есть вопрос для начинающих по 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 ]

9 голосов
/ 15 ноября 2010

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

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");
  }
}

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

3 голосов
/ 15 ноября 2010

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

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

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

public void print(){
    output = "child"
    super.print();
}
1 голос
/ 15 ноября 2010

Причина, по которой 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, что означает, что она может быть прочитана как родителем, так и потомком. Конструктор классов устанавливает переменную в желаемое значение. Таким образом, вы реализуете функцию печати только один раз и не нуждаетесь в дублирующем переопределенном методе.

0 голосов
/ 02 марта 2015

Когда я пытался выяснить ключевое слово 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();
    }

}
...