Classe Abstrata

Pessoal,

O q e um método ou classe abstrata ?

e o ); pq ?

ex:

public nome (Event evt {


); // isso aqui pra q serve o );
}

Isso nao eh uma classe abstrata - eh uma inner class. :wink:

Continuando, uma classe abstrata eh uma classe “incompleta”, onde vc define o esqueleto base para as classes filhas e, ao contrario de uma Interface, voce pode ter tambem metodos reais, que facam algo…

Util para casos onde voce quer prover as funcionalidades basicas e deixar a especializacao/criacao de outros metodos para as classes mais especificas…

Uma inner class eh uma classe que eh definida dentro de outra classe… ja uma classe anonima eh uma classe que nao tem nome…Swing usa mto disso para os eventos da GUI.

Rafael

ainda não entendi…
um exemplo, pode ser…

eu queria entender o pq do [size=“18”]);[/size]
as vezes eu vejo

public …{


e no final tem:

);

}

e segue:

1 - uma classe abstrata não pode ser instanciada ?
2 - posso ter qtas classes abstratas dentro de uma outras classse

pq na interface vc monta o esqueleto q pode ser implementado em uma classe X certo ?

O ); delimita uma classe dentro de uma variável.

Um exemplo

JButton meuBotao;
meuBotao = new JButton( "Eu gosto de banana" );
meuBotao.addActionListener
(
    new ActionListener()
    {
        public void actionPerformed( ActionEvent e )
        {
            ... meu método legal quando clica no botão;
        }
    }
);

Entendeu agora? Toda essa gororoba pertence apenas ao ActionListener do botão :smiley:

[quote=“ozorro”]ainda não entendi…
um exemplo, pode ser…

eu queria entender o pq do [size=“18”]);[/size]
as vezes eu vejo

public …{


e no final tem:

);

}

e segue:

1 - uma classe abstrata não pode ser instanciada ?
2 - posso ter qtas classes abstratas dentro de uma outras classse

pq na interface vc monta o esqueleto q pode ser implementado em uma classe X certo ?[/quote]

Mostre onde foi que você viu o tal );.
Sobre classes abstratas uma possível explicação pode ser a seguinte:
:arrow: Interface define apenas um comportamento que uma classe (ou um conjunto delas) deve seguir. Supondo um modelo onde queiramos definir “coisas que voam” (pássaros, aviãos, etc…), teríamos uma interface “Voador”, mais ou menos assim:

public interface Voador{
   
     public void voa();

}

Sem segredos, huh? Todo o objeto que modelássemos e que voásse, poderia implementar esta interface.

:arrow: Uma classe abstrata é uma pequena especialização sobre uma interface (que é algo beeeem genérico). Seguindo o exemplo, poderíamos ter uma pequena especialização para separar adequadamente coisas que voam e que são animais e coisas que voam e que não são animais. Alguma coisa como:

// supondo que a interface Animal já tivesse sido definida
public abstract class AnimalVoador implements Voador, Animal{

    // especializei o meu método voar... 
    public void voa(){
        bateAsas();
    }

    //métodos da interface Animal

    public abstract void come(Object o) throws IndigestaoException;

    protected void bateAsas(){
       System.out.println("bate asas");
    }

}
// supondo que a interface Maquina já tivesse sido definida
public abstract class MaquinaVoadora implements Voador, Maquina{

    protected int combustivel;

    public abstract void voa(); 

    // metodos da interface Maquina
    public void reabastece(int combustivel){
        this.combustivel = combustivel;
    }
}

No exemplo, foi especializado o método “voa” na classe abstrata AnimalVoador, porque todos animais que voam batem suas asas para isso. No entanto, eu não quis especializar o método “come”, proveniente da interface Animal, pois há animais que são herbívoros, outros que são carnívoros e outros que são onívoros :wink: . A idéia é a mesma para o que foi feito com a classe abstrata MaquinaVoadora, afinal as máquinas podem voar de diferentes maneiras (o mecanismo que faz os aviões voarem é diferente do mecanismo que faz os helicópteros voarem), mas todas elas precisam ser reabastecidas.

E agora entram as classes concretas. Elas são a especialização máxima de um comportamento definido. No nosso exemplo, poderíamos especializar as classes abstratas AnimalVoador e MaquinaVoadora em classes Passaro e Helicoptero, por exemplo.

public class Passaro extends AnimalVoador{

     public Passaro(){ }

     public void come(Object o) throws IndigestaoException{
        if(o instanceof Vegetal)
            System.out.println("nham nham");
         else throw new IndigestaoException("Este animal só come vegetais");
      }

}
public class Helicoptero extends MaquinaVoadora{

     public Aviao(){
     }

     public void voa(){
         giraHelice();         
     }

     private void giraHelice(){
         System.out.println("girando helice");
     }

}

Hmmmm, acho que é isso. Desculpe pelos exemplos idiotas, mas estou passando por uma séria crise de criatividade. Mas espero que tenha servido para alguma coisa.

Não, não Daniel…pelo contrário…agora eu entendi.

Suponha q + a frente eu quera criar uma interface (q na verdade e herança multipla, certo) e o nome dela seja:

interface Funcionario {
.....
}


public abstract class Empresa implements Funcionario{ 

    public void gerente(){ 
        mandao(); 
    } 
  
    protected void mandao(){ 
       System.out.println("Tem cada chefe chato!"); 
    } 

}  

Certo ? creio q com o tempo irei se familiarizando com interfaces!
Grato

[quote=“ozorro”]Não, não Daniel…pelo contrário…agora eu entendi.

Suponha q + a frente eu quera criar uma interface (q na verdade e herança multipla, certo) e o nome dela seja:

interface Funcionario {
.....
}


public abstract class Empresa implements Funcionario{ 

    public void gerente(){ 
        mandao(); 
    } 
  
    protected void mandao(){ 
       System.out.println("Tem cada chefe chato!"); 
    } 

}  

Certo ? creio q com o tempo irei se familiarizando com interfaces!
Grato[/quote]

Desculpe pela demora para responder este tópico. Acredito que você já tenha até sanado suas dúvidas, mas caso contrário (ou para aqueles que estejam lendo este tópico e que ainda não entenderam muito bem esta história toda de interfaces e classes abstratas) é bom responder.

Pelo visto você quis modelar uma empresa no seu sistema. Então vamos pensar um pouquinho em o que é de fato uma empresa. Uma empresa, além da sua infra-estrutura, é um composta por um conjunto de funcionários, cada um com diferentes cargos, que executam tarefas diferente e recebem algum tipo de renumeração. Uma definição simples, certo? Então vamos modelar a nossa empresa a partir desta definição!!
Vamos supor que nossa empresa tenha poucos cargos, como Programador, Analista e Gerente, ok?

[code]

public interface Funcionario{

  public void trabalha();

  public void recebe(double salario);

}

}[/code]

Agora, vamos especializar um pouco nossos funcionários:

public abstract class Geek implements Funcionario{

     public abstract void trabalha();

     public abstract void recebe(double salario);

     public void programa(){
          System.out.println("import java.io.*; :) ");
     }
}

public abstract class BusinessMan implements Funcionario{

     public void trabalha(){
        System.out.println("$$$");
     }

     public abstract void recebe(double salario);
    

}

e agora, nossos programadores, analista e funcionários…

// programador é um geek e também um funcionário...
public class Programador extends Geek{

      private double salario;
     
      public void trabalha(){
           super.programa();
      }

      public void recebe(double salario){
            this.salario = salario;
      }
}
/* analista também é um geek e um funcionário, mas que trabalha de maneira diferente ao programador*/
public class Analista extends Geek{
      private double salario;
     
      public void trabalha(){
           super.programa();
           supervisionaProjeto();
      }

      public void recebe(double salario){
            this.salario = salario;
      }

      private void supervisionaProjeto(){
           System.out.println("Supervisiona");
      }
}

public class Gerente extends BusinessMan{

     private double salario;

     private final double BONUS = 1000.0d;

     public void recebe(double salario){
         this.salario = salario + this.BONUS;
     }

}

Agora, nossa empresa.

[code]
public class Empresa{

   public static void main(String[] args){
      private Funcionario[] funcionario = new Funcionario[5];
      funcionario[0] = new Programador();
      funcionario[1] = new Programador();
      funcionario[2] = new Analista();
      funcionario[3] = new Programador();
      funcionario[4] = new Gerente();
      // faz alguma coisa...
   }

}[/code]

Voilà. Conforme definimos, uma empresa com seus funcionários, cada qual com sua função e tarefas diferentes. E acho que é só. :smiley: