Dúvida em sobrescrever método

11 respostas
J

Boa Tarde!

Por gentileza alguém poderia me ajudar.

Tenho esse exercício:
Crie uma classe Java para um Celular, com os seguintes atributos: modelo (String) e número (int).

  • Faça o encapsulamento destes atributos;
  • Faça a sobrecarga do método que irá alterar o valor do atributo número, permitindo que o programador informe uma string ou um inteiro;
  • Faça a sobrescrita do método correto da classe Object para retornar uma string que representa a concatenação dos atributos da classe.

Segue código:

package ExerciciosCapitulo08;

public class Celular {

	String modelo;
	int numero;

	public Celular(String modelo, int numero) {
		this.modelo = modelo;
		this.numero = numero;
	}

	public String toString() {
		String str = this.modelo + this.numero;
		return str;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public int numero(int numero) {
		return numero;
	}

	public String numero(String numero) {
		return numero;
	}

	public static void main(String[] args) {
		Celular cel = new Celular("Samsung", 25);

		String str = cel.toString();

		System.out.println(cel.modelo);
		System.out.println(cel.numero);
		System.out.println(str);
	}

}

Minha dúvida: Na linha 38 não estou sobrescrevendo o método numero, pois alterei o tipo de “int” para “String”, não é assim a sobrescrita?
Ou é necessário incluir uma condição no método “setNumero” para aceitar String?
Para testar preciso incluir na linha 43 Celular cel = new Celular(“Samsung”, 25); ou o numero 25 ou um carácter correto?

11 Respostas

E

Isso se chama sobrecarga (overload), não sobreescrita (override).

public int numero(int numero) {  
        return numero;  
    }  
  
    public String numero(String numero) {  
        return numero;  
    }
J

entanglement Sim, escrevi errado seria sobrecarregando…Você consegue me ajudar nessas dúvidas?

nel

Oi!

Bom, já que você sabe que está sobrecarregando o método, respondendo as tuas dúvidas.
Quando você chamar o método, ele vai invocar o mesmo de acordo com o parametro passado, ou seja, se houver 4 métodos com o mesmo nome mas que aceitem tipos diferentes em sua assinatura, o Java se encarrega de descobrir a qual deles você se refere.

Portanto, quando invocar o método, basta passar o tipo desejado.
Consegui ser claro?

Abraços.

J

nel Obrigado!

Mais então, está certo o que fiz não é ?

Só que na linha 43 Celular cel = new Celular(“Samsung”, 25); quando passo um carácter no lugar do número 25 diz que o atributo número é do tipo int. Isso acontece porque estou invocando o atributo da classe Celular e não o método que foi sobrecarregado. É isso ?
Se sim, então tenho que fazer de uma outra forma para testar se aceita int e String correto ?

henriqueluz

Isso acontece porque você está chamando o Construtor da classe. E na definição do construtor que você fez você tem um tipo String e um tipo int.
Se voce quiser passar duas strings crie outro construtor com duas strings. :wink:

henriqueluz

Outra coisa, o seu segundo requisito "- Faça a sobrecarga do método que irá alterar o valor do atributo número, permitindo que o programador informe uma string ou um inteiro;
" não está sendo satisfeita em nenhum método.

Você deve sobrecarregar o método setNumero(), usando agora uma string desta forma:

public void setNumero(String numero) {  
        this.numero = Integer.parseInt(numero);  
    }

Abs,

R

Boa noite,

Como foi dito você precisa de um construtor que receba duas Strings, e também como nosso amigo acima disse você também precisa sobrecarregar o método setNumero(), pra que você possa setar tanto um número inteiro quanto uma String, segue o código com as correções:

public class Celular {

    private String modelo;
    private int numero;

    public Celular(String modelo, int numero) {
        this.modelo = modelo;
        this.numero = numero;
    }

    public Celular (String modelo, String numero) {
    	this.modelo = modelo;
    	this.numero = Integer.valueOf(numero);
    }

    public String toString() {
        return this.modelo + " " + this.numero;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public void setNumero(String numero) {
        this.numero = Integer.valueOf(numero);
    }

    public static void main(String[] args) {
        Celular cel = new Celular("Samsung", 25);

        System.out.println("Modelo: " + cel.getModelo());
        System.out.println("Número: " + cel.getNumero());
        System.out.println("Retorno do método toString() que foi sobrescrito: " + cel.toString());
    }
}

Espero ter ajudado!

discorpio

Bom dia a todos.

É importante frizar que a sobrescrita (Override) só é possível nas classes herdadas (extendida), e nunca na mesma classe, enquanto que a sobrecarga (Overload) pode ser feita tanto na mesma classe, quanto nas classes herdadas (extendida).

Diante do acima exposto, já dá para perceber que sobrescrever um método, é você declará-lo nas classes herdadas com a mesma assinatura (mesmo tipo e passagem de parâmetros) da super classe, em outras palavras sobrescrever seria a mesma coisa que voce estivesse substituindo o método antigo da super classe para o método novo na sub classe, e é por isso que a diretiva @Override tem que ser especificada para que o compilador Javac possa identificar que aquele método está substituindo o mesmo método da super classe, se não, na hora de invocar, qual dos dois ele invocaria, já que os métodos da super classe estão presentes também na sub classe, e eles possuem a mesma assinatura.

Quanto ao Overload (sobrecarga), o método é identificado pelo tipo ou pela quantidade de parâmetros que são passados, ou seja, identificado pela sua assinatura.

Um abraço.

J

RodrigoM91

Segue as alterações:

package ExerciciosCapitulo08;

public class Celular {

	String modelo;
	int numero;

	public Celular(String modelo, int numero) {
		this.modelo = modelo;
		this.numero = numero;
	}
	
	public Celular(String modelo, String numero) {
		this.modelo = modelo;
		this.numero = Integer.valueOf(numero);
	}

	public String toString() {
		String str = this.modelo + this.numero;
		return str;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}
	
	public void setNumero(String numero){
		this.numero = Integer.valueOf(numero);
	}
	

	public static void main(String[] args) {
		Celular cel = new Celular("Samsung", 25);

		
		System.out.println("Modelo: " + cel.getModelo());
		System.out.println("Numero: " + cel.getNumero());
		System.out.println(cel.toString());
	}

}
Porque que na linha 45 quando incluo uma String: Celular cel = new Celular(Samsung, 25a);  não  erro no código mais quando compilo aparece a

seguinte mensagem:

Exception in thread main java.lang.NumberFormatException: For input string: a

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.valueOf(Unknown Source)

at ExerciciosCapitulo08.Celular.(Celular.java:15)

at ExerciciosCapitulo08.Celular.main(Celular.java:45)

Desde já agradeço

leo.alvesneuwald

Olá!

Jeh, não sei se foi uma pergunta o que tu escreveu acima. Mas o erro acontece porque na linha 15, como é possível ver no erro apresentado at ExerciciosCapitulo08.Celular.(Celular.java:15) tu está tentando converter o “25a” (string) em um inteiro this.numero = Integer.valueOf(numero); .

Era isso será? Desculpe se entendi mal :oops:

henriqueluz

Exatamente.

O erro acontece porque você está tentando converter essa String “25a” em um inteiro.
Sempre que você tentar converter strings em inteiros e o parâmetro passado não for numeros a exceção NumberFormatException será lançada em tempo de execução.

Abs,

Criado 26 de julho de 2011
Ultima resposta 28 de jul. de 2011
Respostas 11
Participantes 7