2010-11-15 4 views
7

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

public class Parent { 

    private String output = "hallo"; 

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

} 

public class Child extends Parent { 

    private String output = "child"; 

} 

ответ

7

В настоящее время у вас есть два отдельных переменных, а код в 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"); 
    } 
} 

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

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

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

+0

нормально, это работает, но я не не понимаю, почему моя попытка не может работать .... –

+0

@Martin: Потому что вы создаете полностью отдельную переменную и устанавливаете значение *, которое * в 'Child'. Класс 'Parent' не знает о переменной в' Child'. –

3

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

Иными словами, переменные двух переменных являются разными.

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

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

Причина, по которой ребенок не печатает «ребенок», заключается в том, что в наследовании в 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; 
    } 
} 

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

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

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

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

} 
Смежные вопросы