Métodos final

“Um método” declarado final em uma superclasse não pode ser sobrescrito em uma subclasse. Os métodos declarados private são implicitamente final, porque é impossível sobrescrevê-los em uma subclasse(embora a subclasse possa declarar um novo método com a mesma assinatura do método private na superclasse)."

Galera, primeiro Deitel afirma que ele não pode ser sobrescrito, depois ele diz que pode declarar um novo método com a mesma assinatura.

Não entendi, podem me explicar ?

Me parece que foi algum erro de traducao, mas se o texto q tu leu ta em ingles talves ele apenas tenha se abananado um pouco :slight_smile:

um metodo final pode ser public, isto é, qualquer classe pode chama-lo mas nenhuma classe pode sobrescreve-lo.

um metodo private ate aonde eu saiba nao é herdado, por isso voce pode ter um metodo com o mesmo nome na classe filha pois essa nao consegue “enchergar” o metodo private da classe pai.

O que ele falou está certinho.

Você terá um novo método na subclasse, mas esse não será sobrescrito ou herdado da superclasse. Serão métodos diferentes, cada um restrito ao escopo da classe que está declarado.

Esse efeito é chamado shadowing.

[quote=efcjunior]“Um método” declarado final em uma superclasse não pode ser sobrescrito em uma subclasse. Os métodos declarados private são implicitamente final, porque é impossível sobrescrevê-los em uma subclasse(embora a subclasse possa declarar um novo método com a mesma assinatura do método private na superclasse)."

Galera, primeiro Deitel afirma que ele não pode ser sobrescrito, depois ele diz que pode declarar um novo método com a mesma assinatura.

Não entendi, podem me explicar ?[/quote]
bom existe uma diferença ai… um metodo private significa que ele é privado daquela class outra class nao visualiza aquele metodo e se vc declara um metodo como final e nao private significa que esse metodo nao vai herdado mais ele pode ser acessado de outra class… porem ele nao é herdado para vc subscrever o metodo. Assim eu posso acessar um metodo public final void metodo(){} atraves de uma instancia da class… porem nao posso eh subscrever veja:

class Carro{
public final void cor(){}//é um metodo public e nao da class porem nao eh herdado por uma subclass.
private void placa(){} // metodo pertence a class
}
class Ferrari extends Carro{
//nenhum dos metodos é herdado.. um pertence a class e outro é final
Carro c = new Carro();
c.cor(); /// vai tranquilo...
}

o fato de ser final é que o metodo é imutavel, por isso q ele nao eh herdado senao seria subscrito e seria mutavel, um exemplo disso é a class String ela é final…
espero ter ajudado se eu tiver errado alguem me corrige ae :smiley:

eu nao entendi muito bem o que você quis dizer.

Método final é herdado por uma subclasse ele apenas nao pode ser sobrescrito por essa ou qualquer outra subclasse, ou seja, nao pode haver overwrite desse método, mas atentem bem ainda podemos fazer sobrecarga (overload) nesse método.

overload != overwrite

Olá pessoal!!

Já que estamos falando de método final…tenho outra dúvida!!!Por favor, Me corrijam caso esteja errada!!

Métodos finais(não podem sobreescritos) são obrigatoriamente de classes finais(ou seja não podem ser herdadas).

No entanto deitel diz: " Uma declaração do método final nunca pode mudar, assim todas as subclasses utilizam a mesma implementação do método" 6ª ed.pg 353.

Como assim as subclasses utilizam a mesma implementação do método final, se classes finais NÃO podem ser herdadas??

Obrigada pela ajuda!!!

[quote=marcellygomes]Olá pessoal!!

Já que estamos falando de método final…tenho outra dúvida!!!Por favor, Me corrijam caso esteja errada!!

Métodos finais(não podem sobreescritos) são obrigatoriamente de classes finais(ou seja não podem ser herdadas).

No entanto deitel diz: " Uma declaração do método final nunca pode mudar, assim todas as subclasses utilizam a mesma implementação do método" 6ª ed.pg 353.

Como assim as subclasses utilizam a mesma implementação do método final, se classes finais NÃO podem ser herdadas??

Obrigada pela ajuda!!!

[/quote]

sim os metodos finais podem ser herdados, mas tem que utiliza-los como ele foi feito e não podem ser sobrescrito.

final = imutavel;
privado= não herdado;

Entendi…então métodos finais não são necessariamente de classes finais, porém toda classe final tem implicitamente todos os seus métodos finais…Estou certa??