Sobrecarga e sobrescrita

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.

segue o link do artigo: http://www.devmedia.com.br/articles/viewcomp.asp?comp=5124

Pra sobrecarregar metodos, vc DEVE mudar a lista de argumentos

public void init()
public void init(String value)
public void init(Sring value, String key)
public void init(Integer value)

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.

Ué… mas ele está falando de sobrescrita, não sobrecarga.

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.

[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 ?

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.)

[quote=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.)[/quote]

então o artigo está errado ? rs.rs.rs. Ou aqui não pode falar se um artigo está errado ?.

Isso mesmo.

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.

Espero ter clareado um pouco.
Abraços.

<><

[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);
}

}[/code]

Cara vê se isso te ajuda!

Abraço!

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…

[quote=efcjunior]…

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

Abraços
<><

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

falow !

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.

Abraços