Sobrescrita e Sobrecarga de Métodos

Sobrescrita de Métodos

A sobrescrita de métodos ocorre quando tem uma subclasse herdado uma classe ou implementado uma interface. Esse método caracteriza-se pela assinatura do método ser igual ao método da Superclasse ou da Interface ou pela anotação @Override (Sobrescrita) acima do método.

Casos que pode ser identificado à sobrescrita.

Quando uma classe herda a classe Object.

package entity;

// A classe Object está implicita na classe Cliente
//public class Cliente extends Object
public class Cliente {

	private Integer idCliente;

	private String nome;

	@Override
	public String toString() {
 	  return "Cliente [idCliente=" + idCliente + ", nome=" + nome + "]";
	}

	public Integer getIdCliente() {
		return idCliente;
	}
	public void setIdCliente(Integer idCliente) {
		this.idCliente = idCliente;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
}
        

Quando uma Subclasse herda uma Superclasse.

Nesse caso está sendo sobrescrito o método imprimirDescricao do Funcionario e reescrito no FuncionarioCLT.

package entity;

public class Funcionario {
	
	private Integer idFuncionario;	
	private String nome;	
	private String descricao;
	
	public Funcionario() {
	}

	public Funcionario(Integer idFuncionario, String nome, String descricao) {
		super();
		this.idFuncionario = idFuncionario;
		this.nome = nome;
		this.descricao = descricao;
	}

	@Override
	public String toString() {
		return "Funcionario [idFuncionario=" + idFuncionario + ", nome="     + nome	+ ", descricao=" + descricao + "]";
	}

	public Integer getIdFuncionario() {
		return idFuncionario;
	}
	public void setIdFuncionario(Integer idFuncionario) {
		this.idFuncionario = idFuncionario;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String imprimirDescricao(){
		return "Funcionario Padrao";
	}
}
package entity;

public class FuncionarioCLT extends Funcionario {	
		
	public FuncionarioCLT() {
	}

	public FuncionarioCLT(Integer idFuncionario, String nome) {
		super(idFuncionario, nome);	
	}

	@Override
	public String imprimirDescricao() {		
		return "Funcionario CLT";
	}
}    

Executando...

package main;

import entity.Funcionario;
import entity.FuncionarioCLT;

public class Main {
	
	public static void main(String[] args) {
		
		Funcionario f = new Funcionario(1, "Joao");
		
		System.out.println("Funcionario: " + f + "\n Descricao: " + f.imprimirDescricao());
		
		FuncionarioCLT f1 = new FuncionarioCLT(2, "Luiz");
		System.out.println("\nFuncionario: " + f1 + "\n Descricao: " + f1.imprimirDescricao());		
	}
}

Quando uma classe implementa uma Interface.

package entity;

public interface IArquivo {

	public void open() throws Exception;	
	public void close() throws Exception;
	
}
package entity;

public class Arquivo implements IArquivo {

	@Override
	public void open() throws Exception {		
		System.out.println("Abrir o Arquivo");
	}

	@Override
	public void close() throws Exception {
		System.out.println("Fechar o Arquivo");
	}
}    

Executando...

package main;

import entity.Arquivo;

public class Main {
	
	public static void main(String[] args) {
		
		Arquivo a = new Arquivo();
		
		try {
			a.open();
			a.close();
		} catch (Exception e) {
			System.out.println("Error" + e.getMessage());
		}		
	}
}   

Sobrecarga de Métodos

A sobrecarga de métodos ocorre quando tem dois ou mais métodos que possuem a mesma assinatura e só mudando o tipo ou a quantidades de parâmetros declarados nele.

Casos que pode ser identificado à sobrecarga:

Quando declaramos dois ou mais construtores na classe

package entity;

public class Cliente {

	private Integer idCliente;
	private String nome;

	public Cliente() {
		
	}

	public Cliente(Integer idCliente, String nome) {
		super();
		this.idCliente = idCliente;
		this.nome = nome;
	}	
}

Quando ocorre é declarado dois ou mais métodos na mesma classe.

A assinatura: public void print Os parametros: int a ; double a ; int a , int b

package entity;

public class Numero {
	
	public void print(int a){
		System.out.println("Numero" + a);
	}
	
	public void print(int a, int b){
		System.out.println("Numero" + a);
	}
	
	public void print(double a){
		System.out.println("Numero" + a);
	}	
}

Nesse caso ocorre quando herda uma Superclasse

package entity;

public class Numero {
	
	public void print(int a){
		System.out.println("Numero" + a);
	}
	
	public void print(int a, int b){
		System.out.println("Numero" + a);
	}
	
	public void print(double a){
		System.out.println("Numero" + a);
	}	
}    
package entity;

public class NumeroNatural extends Numero {
		
	public void print(int a, int b, int c ){
		System.out.println("Numeros" + a + b + c);
	}	
}    

Executando...

package main;

import entity.NumeroNatural;

public class Main {
	
	public static void main(String[] args) {
		
		NumeroNatural nn = new NumeroNatural();
		
		//Metodos da SuperClasse Numero
		nn.print(1);		
		nn.print(2.);		
		nn.print(3, 4);
		
		//Metodo da SubClasse NumeroNatural
		nn.print(3, 5, 4);
	}
}