Duvida: Herança e Instanciação

Estou com uma duvida no codigo abaixo:
class Empregado{
public String nome;
public int salario;
public String mostraDetalhes(){
return “sou empregado”;
} }

class Engenheiro extends Empregado{
public int nota;
public String mostraDetalhes(){
return “sou engenheiro”;
} }

class MinhaClasse{
public static void main(String[] args){
Empregado e = new Engenheiro();
if (e instanceof Engenheiro){
System.out.println(“Verdade”);
e.nome=“Paulo”;
e.nota=99;
System.out.println (“O salario:”+e.salario);
System.out.println ("A profissao: "+e.mostraDetalhes());
System.out.println (“A nota:”+nota);
}
else{
System.out.println(“falso”);
}}}

As duvidas são:
a) porque não posso usar e.nota=99; no programa principal? (dá mensagem: “Cannot resolve symbol variable nota”… e no comando System.out.println (“A nota:”+e.mostraDelhes()); não apresenta erro?.
b) nao entendi direito o que é feito no comando “Empregado e = new Engenheiro();”, pois estava acostumado a usar em outros exemplos Empregado e = new Empregado (que significa que declarei um objeto do tipo Empregado e instanciei na memoria para poder usar seu construtor).

Agradeço as dicas e ajudas que vierem… pois tenho muito a aprender ainda.

em resposta a primeira duvida, voce não consegue acessar nota, porque apesar de voce estar instanciando engenheiro, voce esta fazendo isso como empregado, o que não da erro pq empregado é pai de engenheiro, como sua variavel é empregado ela não encherga a variavel da classe engenheiro. E a segunda pergunta cho que ja foi respondida com a primeira

PhfCosta…Agradeço a dica… me ajudou a compreender o topico.
Mas se eu quisesse inserir um valor na variavel nota… o certo seria eu instanciar um outro objeto? por exemplo:
Empregado e = new Engenheiro();
Engenheiro k = new Engenheiro();
if (e instanceof Engenheiro){
System.out.println(“Verdade”);
e.nome=“Paulo”;
k.nota=99;

Agradeço a dica… Estou estudando muito (Deitel) para aprender mais.
Caso o exemplo acima estiver errado, pode me passar um exemplo de como seria o certo?!

Valeu

Use encapsulamento das variáveis que você contém na classe, exite colocar variáveis públicas!!!

Você pode usar herança para fazer com que seu código fique enxuto, no caso acima, vc está colocando Empregado e Engenheiro com os mesmos métodos!!! A não ser que você queira utilizar overrides(sobrescrita de métodos), e também se for para sobrescrever, sobrescreva os set’s, aí os gets pode deixar somente na supeclasse!

Pq vc está declarando uma varíavel do tipo Empregado e instanciando-a em Engenheiro?
Não será possível fazer isso, pelo que eu sei, assim como phfcosta disse!

Bom, veja onde vc tem dúvida, se é em Java msm ou em Orientação a objetos, para que possamos ajudá-lo, no caso vejo que é em orientação a objetos.

Espero ter ajudado.

[quote=“novato-mg”]PhfCosta…Agradeço a dica… me ajudou a compreender o topico.
Mas se eu quisesse inserir um valor na variavel nota… o certo seria eu instanciar um outro objeto? por exemplo:
Empregado e = new Engenheiro();
Engenheiro k = new Engenheiro();
if (e instanceof Engenheiro){
System.out.println(“Verdade”);
e.nome=“Paulo”;
k.nota=99;

Agradeço a dica… Estou estudando muito (Deitel) para aprender mais.
Caso o exemplo acima estiver errado, pode me passar um exemplo de como seria o certo?!

Valeu[/quote]

Poderia fazer assim…

Classe: Empregado.class

public class Empregado

private String detalhes;

//Classe construtora
public Empregado(String empregado){

  this.setDetalhes(empregado);

}

public setDetalhes(String detalhes){

  this.detalhes = detalhes;

}

}

public String getDetalhes(){

  return this.detalhes;

}

Classe Engenheiro.class


public class Engenheiro 
   extends Empregado{

   private int nota;
   private String nome;

   public Engenheiro(){    
      super("Sou engenheiro");
   }

   public setNota(int nota){
      this.nota = nota;
   }

   public int getNota(){
      return this.nota;
   }


   public setNome(String nome){
      this.nome = nome;
   }

   public String getNome(){
      return this.nome;
   }


}

Classe Principal.class


public class Principal{

public static void main(String[] args) {

Engenheiro k = new Engenheiro();

if (k instanceof Engenheiro){

System.out.println("Verdade");
k.setNome("Paulo");
k.setNota(99);

}

}

}

Desse jeito também é interessante…

Noahwuv… a parte de encapsulamento nao usei para criar o codigo mais rapido quando estava postando…
Vou tentar refazer os códigos usando suas dicas e posto novamente.
A questão de usar a Orientaçao a Objetos de pouco em pouco estou me acostumando…é dificil para quem estava acostumado com C++ .
Obrigado pela ajuda.

Novato, esquece o que te disseram antes, vc estava fazendo certinho sim, atribuir um Engenheiro a um Empregado é legal, e muito util ainda por cima, pode ser que nesse seu exemplo não tenha sentido, mas muitas vezes vc vai fazer isso. A parte de deixar o atributo publico é outro assunto que não tem a ver com herança, mas o bom realmente é vc deixar private, mas como se trata obviamente de um exemplo, faça como quizer…

Quando vc faz:

Empregado e = new Engenheiro();

Vc tah dizendo, olha, eu tenho um empregado que vai se comportar como engenheiro, mas ele é um empregado, a minha variavel ‘e’ pode apontar para qualquer empregado (Analista, Lixeiro, Programador), então eu não posso acessar coisas que só engenheiro tem a partir dela, já que ela é do tipo Empregado, isso é a base para pensar em uma forma abstrata das coisas e é bastante (muito mesmo) util, por exemplo para parâmetros em métodos:

void cadastraEmpregado(Enpregado e) {
  System.out.print(e.mostraDetalhes());
}

esse método pode receber um engenheiro, um lixeiro, um analista, porque o que ele faz é cadastrar empregados, ou seja, ele recebe um empregado qualquer, que vc não sabe quem é, só sabe que é um Empregado, então aquela variavel ‘e’ pode acessar tudo que qualquer empregado tem em comum. Vc pode chamar esse método:

cadastraEmpregado(new Engenheiro());
cadastraEmpregado(new Programador());
cadastraEmpregado(new Professor());

percebeu que ‘e’ vai ser Programador, Engenheiro, Professor… por esses motivos vc naum pode acessar coisas que só uma dessas subclasses de Empregado tem a partir da variavel do tipo Empregado.

bah, eu não sei explicar muito bem assim sem falar com vc direto, manda um PM para mim que eu te passo meu msn e te explico hj anoite se vc quizer, o negócio é simples, é só pegar o jeito…

Ah, e sim, se vc quizer alterar o atributo nota da classe Engenheiro, vc tem que ter realmente uma variavel do tipo Engenheiro, a menos que faça castings tipo

Empregado e = new Engenheiro();
if(e instanceof Engenheiro) //para ter certeza de dar certo o casting {
    ((Engenheiro)e).nota = 4;
}

mas fazer isso não é a coisa mais bonita do mundo ehhehe evite :stuck_out_tongue:

Noahwuv… testei o codigo, mas na classe principal apresentou alguns erros:

Na classe Empregado e Engenheiro acrescentei o VOID nos SETS que faltavam.
Na classe Principal alterei para

public class Principal{
public static void main(String[] args) {
Engenheiro k = new Engenheiro();
if (k instanceof Engenheiro){
System.out.println(“Verdade”);
k.setNome(“Paulo”);
k.setNota(99);
System.out.println("O nome:"+k.getNome());
System.out.println(“A nota:”+k.getNota());
}
}
}

Alterei o = para () e funcionou. Vc deve ter esquecido.
Acrescentei uma impressão com o uso do GET.
Cara… agradeço de MONTAO as dicas … a gente só APRENDE testando e correndo atras das duvidas.
ESPERO UM DIA RETORNAR A AJUDA.

Aproveito para agradecer todos que virao as mensagens e que tentaram fazer um exemplo para me AJUDAR… VALEU

Ae novato-MG.

Obrigado pelas correções, escrevi meio na pressa e acabei esquecendo. vou editá-lo para ficar correto.

Eu tb estou em fase de aprendizado constante, a cada dia que passo aprendo algo diferente! E é assim msm, correndo atrás é que se aprende!

luBS, valeu aí, eu tb não sabia que podia fazer Empregado e = new Engenheiro()… é pelo fato de ter Herança?

Abraços a todos!

luBs…Vc arrebentou nas explicaçoes…VALEU… enviei uma MP …espero que tenha recebido. Na parte da noite tentarei fazer um contato com vc pelo MSN para tirar outras duvidas…Agradeço de Montão.

Fiquei surpreso com o numero de acessos a esse tópico, isto mostra que muitos ainda tem curiosidades ou duvidas a respeito de Herança e Instanciação.

A galera desse Forum é realmente nota 1000 !!!

[quote=“Noahwuv”]Ae novato-MG.

Obrigado pelas correções, escrevi meio na pressa e acabei esquecendo. vou editá-lo para ficar correto.

Eu tb estou em fase de aprendizado constante, a cada dia que passo aprendo algo diferente! E é assim msm, correndo atrás é que se aprende!

luBS, valeu aí, eu tb não sabia que podia fazer Empregado e = new Engenheiro()… é pelo fato de ter Herança?

Abraços a todos![/quote]

Sim, ja que Engenheiro eh um Empregado, vc pode atribuir um Engenheiro a uma variavel do tipo Empregado, mas soh vai ver o que Empregado ve. Um dia vcs ainda vaum ouvir falar de programar para interface, ai isso vai ser mais importante ainda.

novato, eu naum recebi sua PM, vou mandar uma para vc, depois vc me add la. Devo tar no PC e no MSN la pelas 21h

valeu!