Método protected X herança [RESOLVIDO]

6 respostas
sinister182

Boa tarde pessoa, estava estudando e apareceu a seguinte dúvida: Eu tenho uma classe que tem alguns métodos protected, existe uma segunda classe que herda da primeira esses métodos...qual a forma correta de chamar esses métodos na minha segunda classe ? eu preciso instanciar um objeto da primeira ?

o código que eu estava fazendo é o seguinte:

public class TesteProtected {

	protected int somar (int a , int b) {
		int soma = a + b;
		return soma;
	}
	
	protected int subtrair ( int a , int b) {
		int subtracao = a - b;
		return subtracao;
	}
	
	protected double dividir ( int a , int b) {
		double divisao = a / b;
		return divisao;
	}
	
	protected int multiplicar ( int a , int b ){
		int multiplicacao = a * b;
		return multiplicacao;
	}
}
public class TesteProtected2 extends TesteProtected {
	
	public static void main (String [] args) {
		TesteProtected tp1 = new TesteProtected();
		System.out.println(tp1.somar(3,2));
		System.out.println(tp1.subtrair(3,2));
		System.out.println(tp1.dividir(3,2));
		System.out.println(tp1.multiplicar(3,2));
	}
	
}

tentei chamar os métodos protected's na segunda classe sem instanciar um objeto mas não foi possível...está correto da forma como fiz para usar esses métodos ou não ? ( eu acredito que não pois estou usando os métodos diretamente da primeira classe correto ? e não os métodos herdados que "estão" na segunda...)

qual seria a forma correta ?

agradeço a todos que tirarem essa minha dúvida
[]'s
Marcelo

6 Respostas

renanreismartins

neste caso vc esta usando herança de forma desnecessaria… coloque o metodo main na classe TesteProtected e rodara normalmente.

Herança deve ser usada quando se quer extender funcionalidades de uma classe. ex: Professor extends Pessoa… isso é correto pq td professor é um aluno, fique atento as armadilhas da herança.

aconselho a leitura da apostila fj-11 disponibilizada no site da caelum (caelum.com.br)

abraços

Giulliano

Ele quis dizer que todo professor é uma pessoa, e não um aluno. Voltando ao assunto eu discordo do que foi dito pelo Renan.

Você pode usar herança caso queira sobreescrever algum método. Por exemplo a classe A tem o método “voar, andar e nadar” e você precisa implementar os mesmos métodos que existem na classe A porém com mudanças no método voar. Então você cria a classe “B extends A” e sobreescreve o método “voar”.

Os outros métodos podem ser chamados diretamente da classe A se não forem necessárias alterações.

ViniGodoy

Respondendo a sua pergunta. Você chama um método protected na classe filha, como se ele estivesse na própria classe. Por exemplo:

public class TesteProtected {

	protected int somar (int a , int b) {
		int soma = a + b;
		return soma;
	}
	
	protected int subtrair ( int a , int b) {
		int subtracao = a - b;
		return subtracao;
	}
	
	protected double dividir ( int a , int b) {
		double divisao = a / b;
		return divisao;
	}
	
	protected int multiplicar ( int a , int b ){
		int multiplicacao = a * b;
		return multiplicacao;
	}
}
public class TesteProtected2 extends TesteProtected {  
   public void fazContas() {
      System.out.println(somar(3,2));
      System.out.println(subtrair(3,2));
      System.out.println(dividir(3,2));
      System.out.println(multiplicar(3,2));
   }

   public static void main(String args) {
      TesteProtected2 teste = new TesteProtected2();
      teste.fazContas();
   }   
}

Sua dúvida apareceu pq o main é um método estático. Nesse caso, você não poderá acessar métodos não estáticos.
Note que no meu exemplo, eu crei um método não estático, para poder chamar os da classe pai. E no main, crei uma instância da filha que fará uso desses métodos ao chamar fazContas().

Tiburcio_Mancha

Ao exemplo implementado, o q esta dando errado é o seguinte:

Sua classe TesteProtected2 herda os métodos de TesteProtected, sendo que vc não precisa criar uma instãncia para acessar os métodos da classe mãe. mas ae vc cai em outro problema:

O seu método main é static e métodos static só podem chamar métodos que sejam static. A partir disto, uma implementação compilável seria esta:

public class TesteProtected {
	
	protected static int somar (int a , int b) {   
        int soma = a + b;   
        return soma;   
    }   
       
    protected static int subtrair ( int a , int b) {   
        int subtracao = a - b;   
        return subtracao;   
    }   
       
    protected static double dividir ( int a , int b) {   
        double divisao = a / b;   
        return divisao;   
    }   
       
    protected static int multiplicar ( int a , int b ){   
        int multiplicacao = a * b;   
        return multiplicacao;   
    }   
}
public class TesteProtected2 extends TesteProtected {   
       
	public static void main (String [] args) {   
  
        System.out.println(somar(3,2));   
        System.out.println(subtrair(3,2));   
        System.out.println(dividir(3,2));   
        System.out.println(multiplicar(3,2));   
    }         
       
}

Concluindo, este não seria um melhor exemplo para aprendizado, sendo que como o giulliano disse, a apostila da caelum tem uma boa base para estudo

rimarck

É que você está confundindo métodos estáticos (de classe) com métodos sem ser estáticos (de objeto)…para todo método de objeto, você terá que primeiro instânciar o objeto para depois poder utilizá-lo…tipo olha o exemplo que fiz abaixo:

public class TesteProtected {
    // Metodo estatico de classe
    protected static void imprimirTesteStatic1() {
        System.out.println("Metodo estatico 1, ou seja, da classe!");
    }

    // Metodo de objeto
    protected int somar(int a, int b) {
        int soma = a + b;
        return soma;
    }

    // Metodo de objeto
    protected int subtrair(int a, int b) {
        int subtracao = a - b;
        return subtracao;
    }

    // Metodo de objeto
    protected double dividir(int a, int b) {
        double divisao = a / b;
        return divisao;
    }

    // Metodo de objeto
    protected int multiplicar(int a, int b) {
        int multiplicacao = a * b;
        return multiplicacao;
    }
}
public class TesteProtected2 extends TesteProtected {

    // Metodo estatico de classe
    protected static void imprimirTesteStatic2() {
        System.out.println("Metodo estatico 2, ou seja, da classe!");
    }

    // Metodo de objeto
    protected void imprimirMetodosHerdados() {
        // Aqui você nao cria um objeto, pois este metodo é de objeto
        // Ou seja para chamar este metodo voce tem que instanciar um objeto
        // Aqui se usa super.metodo()
        System.out.println(super.somar(3, 2)); // Metodo de objeto herdado
        System.out.println(super.subtrair(3, 2)); // Metodo de objeto herdado
        System.out.println(super.dividir(3, 2)); // Metodo de objeto herdado
        System.out.println(super.multiplicar(3, 2)); // Metodo de objeto herdado
    }

    // Metodo estatico de classe / metodo main
    public static void main(String[] args) {
        TesteProtected2.imprimirTesteStatic1(); // Metodo estatico de classe 1 herdado
        TesteProtected2.imprimirTesteStatic2(); // Metodo estatico de classe 2

        TesteProtected2 tp2 = new TesteProtected2(); // tem que criar um objeto para usar metodo de objeto
        tp2.imprimirMetodosHerdados(); // Metodo de objeto
        System.out.println(tp2.somar(2, 2)); // Metodo de objeto herdado
    }
}

Metodos estáticos (de classe) não podem invocar/chamar métodos não estáticos (de objeto) sem instanciar um objeto.

sinister182

Galera muito obrigado a todos que responderam…eu intendi o conceito de herança só implementei algo assim para ilustrar o “problema” que eu estava tendo e não em atentei para o fato de tentar chamar métodos não estaticos sem instanciar um objeto ou seja caso eu não estivesse dentro do main eu poderia tranquilamente chamar diretamente os métodos que eu havia criado.

Agradeço novamente a todos que responderam, sanaram completamente minhas dúvidas

[]'s
Marcelo

Criado 5 de janeiro de 2010
Ultima resposta 5 de jan. de 2010
Respostas 6
Participantes 6