Runtime type

no código abaixo, porque o método talk() de Person é executado se a chamada do método depende do objeto atual e não da referência?

public class Person {   
	private void talk(String s){  
		System.out.println ("I'm saying: " + s);   
	}   
	public static void main(String[] args) {
		Person p = new Director();      
		p.talk("Hello");   
	}   
}

class Director extends Person {   
	public void talk (String s){      
		System.out.println ("I'm the director");
	}
}

Acontece que o teu metodo talk na classe Person eh private, ao inves de public. Como, ao fazer heranca, Director nao tem acesso ao talk() de Person, eh como se fosse um metodo independente, e nao override.

Se voce mudar para public, vai funcionar da maneira desejada.

Rafael

ok, obrigado!

é o mesmo que dizer que métodos private, assim como os static não são herdados?

perfeito
metodos e atributos privates, nao sao herdados. metodos static nao eh bem que ele nao eh herdado, eh que ele eh resolvido em tempo de ompilacao, entao nao existe invocacao de metodo virtual nesse caso.

voce pode acessar os metodos estaticos nao privados da sua superclasse, logo, voce meio que herdou. mas voce nao pode fazer overriding.

bem, voce entendeu, o resto eh nomenclatura

Nem métodos private nem métodos default são herdados. Assim não há nunca override pra esses casos.

No caso dos estáticos, se públicos (ou protected), são herdados, mas não existe override possível (mas sim a possibilidade para uma redeclaração do método). A razão é que métodos estáticos não são avaliados no runtime, mas no momento da compilação (não havendo polimorfismo).

Espero ter ajudado,

[quote=“Mauricio De Maria”]Nem métodos private nem métodos default são herdados. Assim não há nunca override pra esses casos.
[/quote]

métodos default não são herdados, então porque se eu retirar o modificador private o método de Director é chamado?

Fala Márcio, beleza?!

Você tem razão. Os de acesso default são herdados, mas apenas se estiverem no mesmo package, senão não o são (daí o uso do protected).

Abraços,

certo, obrigado!

acabei de ler por lá:

(3.3.4):
A method can be overridden only if it is accessible. If the method is not accessible then it is not inherited, and if it is not inherited it can’t be overridden.

Correto.

Isso se aplica aos métodos default, que não são herdados, se estiverem em pacote diferente. Assim, não podem mesmo ser overriden nesse caso.

Abraços,
Maurício.