Ereditarietà Java Ordine pubblico e privato [duplicato] - java

Sto avendo difficoltà a capovolgere questo strano comportamento dell'ereditarietà di Java.

Di ', ho Genitore classe con metodo privato Method1. Poi c'è una classe Bambino quello si estende Genitore classe. Bambino definisce anche il metodo chiamato Method1, ma è pubblico. Si prega di vedere sotto per esempio:

public class Main {
public static void main(String[] args) {

Parent p = new Child();
p.method2();
}
}

class Parent{
private void method1() {
System.out.println ( "Parent"s method1()" );
}

public void method2() {
System.out.println ( "Parent"s method2()" );
method1();
}
}

class Child extends Parent {
public void method1() {
System.out.println ( "Child"s method1()" );
}
}

Quello che non capisco è che l'output è sotto !!!

Parent"s method2()
Parent"s method1()

Lo so da allora Method1 è privato in Genitore, Method1 in Bambino non ha niente a che fare con quello di Genitore. Se è così, allora quando method2 invoca Method1, perché è Genitore"S Method1 è chiamato no Bambino"s? Soprattutto quando il tipo effettivo è Bambino.

Sembra che non ci sia assolutamente alcun indizio su quale Method1 è chiamato da method2. Mi manca una regola di ereditarietà? Per favore aiutatemi !!!

risposte:

2 per risposta № 1

private void method1() impedisce il superamento del metodo.
Pertanto, qualsiasi classe figlio non può ereditarlo method1().
Nel tuo codice, la classe figlio ha il suo separato method1().


Parent p = new Child(); // We have p of Parent reference and is a Child object
p.method2(); // At compile time this statement binds the method2() from Parent class

Poiché solo la classe genitore ha il method2(), è stato chiamato.


Tuttavia, supponiamo di aver sovrascritto questo metodo nella classe Child.

class Child extends Parent {
public void method1() {
System.out.println("Child"s method1()");
}
public void method2() {
System.out.println("Child"s method2()");
}
}

In questo caso, anche in fase di compilazione, method2() è associato alla classe Genitore.
Ma a runtime, il method2() viene chiamata la classe Child. Questo è il polimorfismo di runtime.

Così uscita per la chiamata p.method2() sarebbe stato

Child"s method2()
Child"s method1()

1 per risposta № 2

private metodi e campi non sono ereditato. protected è il modificatore di accesso a cui stavi pensando. Nel tuo post, i metodi non sono correlati (a parte avere lo stesso nome).

protected void method1() {
System.out.println ( "Parent"s method1()" );
}

Più popolare