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.
[quote=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.[/quote]
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 ?
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.)
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.)[/quote]
então o artigo está errado ? rs.rs.rs. Ou aqui não pode falar se um artigo está errado ?.
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.
[code] class subscrita{
public void metodo1(){
System.out.print(“Super Classe”);
}
}
public class teste extends subscrita {
public void metodo1(){ // subscrita
System.out.print("SubClasse");
}
public String metodo1(String sTexto){
return sTexto;
}
public static void main(String e[]){
teste t = new teste();
String s = t.metodo1("\nsobrecarga");
t.metodo1();
System.out.print(s);
}
O que o colega quis dizer, acho meio que impossível:
…[/quote]
Eu quis dizer isso:
class test{
public void printMessage(String s1){
System.out.println(s1);
}
}
class SubTest extends test{
// sobrecarregando metodo da classe pai
public void printMessage(String s1, String s2){
System.out.println(s1+s2);
}
public static void main(String[] args){
SubTest st = new SubTest();
st.printMessage("Test"); // refere-se a classe pai
st.printMessage("Sub","Test"); //refere-se a classe filha
}
}
Espero que tenha facilitado ao inves de complicado ;D
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.
Super Classe:
public void printMessage(String s1)
{
System.out.println(s1);
}
SubClasse:
// 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.
@Override
public void printMessage(String s1)
{
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.
public void printMessage(String s1, String s2)
{
System.out.println("Método sobrecarregado !");
}
Se vc descorda, manda aí, só assim vamos aprender de verdade…rs
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.