Galera eu estava lendo um artigo na devmedia sobre sobrecarga e sobrescrita e tive algumas dúvidas referente ao que estava sendo apresentado:
Fui testar essa definição no eclipse e não consegui declarar mais de um método com o mesmo na mesma classe. Na subclasse, eu consegui, mas, quando alterei o modificador de pulibli para um mais restritivo, por exemplo, protected, também não compilou.
Queria saber de vocês, se estou interpretando errado, ou se esta definição está errada.
Na mesma classe não tem como mesmo não.
E está certo. Você só poder modificar a visibilidade de um atributo de um menos restritivo para um mais restritivo.
A regra para visibilidade é simples, tudo o que é permitido na classe Pai, deve ser permitido também na classe filha:
Imagine se um método publico no pai pudesse ser tonado privado no filho. Coisas como essa se tornariam esquisitas:
Pai obj = new Filho();
obj.metodoPulicQueVirouPrivate();
Que visibilidade ele teria que seguir? A do pai, que é public ou a do filho, que é private?
Para evitar situações esquizofrênicas como essa, não dá mesmo para restringir a visibilidade num filho.
V
ViniGodoy
Ué… mas ele está falando de sobrescrita, não sobrecarga.
F
fabim
Vini, eu estou lendo o seguinte no topico:
"Fui testar essa definição no eclipse e não consegui declarar mais de um método com o mesmo na mesma classe. "
Isso eu entendo por sobrecarga. Ou estou trabalhando muito e ficando doido.
E
efcjunior
ViniGodoy:
Na mesma classe não tem como mesmo não.
E está certo. Você só poder modificar a visibilidade de um atributo de um menos restritivo para um mais restritivo.
A regra para visibilidade é simples, tudo o que é permitido na classe Pai, deve ser permitido também na classe filha:
Imagine se um método publico no pai pudesse ser tonado privado no filho. Coisas como essa se tornariam esquisitas:
Pai obj = new Filho();
obj.metodoPulicQueVirouPrivate();
Que visibilidade ele teria que seguir? A do pai, que é public ou a do filho, que é private?
Para evitar situações esquizofrênicas como essa, não dá mesmo para restringir a visibilidade num filho.
Então, as duas definições estão erradas…Não posso restringir a visibilidade de um método sobrescrito e também não posso declarar mais de um método idêntico na mesma classe ? isso ?
F
fabim
Chega de confusao. Vo resumir:
Sobrecarga: Definir mais de um metodo com o mesmo nome. Pode, desde que vc ALTERE A LISTA DE ARGUMENTOS.
Sobrescrita: Redefinir um metodo na subclass. Pode, mas nao pode colocar um modificador MAIS RESTRITIVO. (Ex: se é public na superclasse, nao pode virar protected na subclasse.)
E
efcjunior
fabim:
Chega de confusao. Vo resumir:
Sobrecarga: Definir mais de um metodo com o mesmo nome. Pode, desde que vc ALTERE A LISTA DE ARGUMENTOS.
Sobrescrita: Redefinir um metodo na subclass. Pode, mas nao pode colocar um modificador MAIS RESTRITIVO. (Ex: se é public na superclasse, nao pode virar protected na subclasse.)
então o artigo está errado ? rs.rs.rs. Ou aqui não pode falar se um artigo está errado ?.
V
ViniGodoy
Isso mesmo.
D
Djonatah
Minha definição:
Sobrescrita - refere-se apenas a metodos das classes filhas. É o ato de mudar o comportamento de um método em uma sub classe.
Sobrecarga - refere-se tanto a mesma classe, como a classe filha. É o ato de ter-se mais de um método com o mesmo nome, podendo ter ou não ter: o mesmo tipo de retorno, a mesma restritividade, as mesmas exceções checadas. e TENDO que mudar a lista de parâmetros.
Não existe sobrescrita em métodos da mesma classe, isso não faz sentido. Por outro lado existe sobrecarga, facilitando o programador com sua API.
Galera eu entendi. Muito obrigado mesmo pelas respostas…
Pelo que eu entendi existe uma sobrecarga direta e indireta…
Sobrecarga direta é aquela que irei fazer com um método particular daquela classe.
Sobrecarga indireta é aquela que irei fazer com um método sobrescrito de uma superclasse.
O que o colega quis dizer, acho meio que impossível:
Obrigado…
D
Djonatah
efcjunior:
…
O que o colega quis dizer, acho meio que impossível:
…
Eu quis dizer isso:
classtest{publicvoidprintMessage(Strings1){System.out.println(s1);}}classSubTestextendstest{// sobrecarregando metodo da classe paipublicvoidprintMessage(Strings1,Strings2){System.out.println(s1+s2);}publicstaticvoidmain(String[]args){SubTestst=newSubTest();st.printMessage("Test");// refere-se a classe paist.printMessage("Sub","Test");//refere-se a classe filha}}
Espero que tenha facilitado ao inves de complicado ;D
Abraços
<><
E
efcjunior
Djonatah, na boa mesmo…rs Acho que vc tb tá se complicando.
Isso que vc fez é um override(Sobrescrita), ou seja, a assinatura do método deve ser idêntica a da superclasse. O corpo de método que vc vai sobrescrever.
// Sobrescrita:// Sobrescreve um método que foi originalmente implementado na superclasse.// modificador de acesso:o mesmo ou menos restrito.// tipo de retorno:obrigatoriamente idêntico.// nome:obrigatoriamente idêntico.// parâmetros:obrigatoriamente idênticos e na mesma ordem.// nome dos parametros: indiferente.@OverridepublicvoidprintMessage(Strings1){System.out.println("Método sobrescrito");}// sobrecarga:// Cria diversas formas de oferecer um serviço com o mesmo nome.// modificador de acesso: indiferente.// tipo de retorno: indiferente.// nome:obrigatoriamente idêntico.// parâmetros:devem ser diferentes ou em ordens diferentes// (desde que tenham tipos diferentes.)// nome dos parametros: indiferente. publicvoidprintMessage(Strings1,Strings2){System.out.println("Método sobrecarregado !");}
Se vc descorda, manda aí, só assim vamos aprender de verdade…rs
falow !
D
Djonatah
ecfjunior
Eu não estou me confundindo, o meu código também não está errado (e ele é sim uma sobrecarga, pois como você disse, para sobreescrever um método a declaração do método TEM que ser totalmente idêntica!).
Você também não está errado.
Talvez eu não tenha me expressado da maneira correta.
Vamos lá:
quando eu falei que sobrecarga “refere-se tanto a mesma classe, como a classe filha”, eu quis dizer que você pode sobrecarregar (na classe filha) um método que foi inicialmente declarado na classe pai. E foi isso que eu fiz no meu exemplo, um método na classe pai sobrecarregado na classe filha. Mesmo que ele pareça um método sobreescrito, o método foi sobrecarregado, pois a lista de parâmetros é diferente.