Algumas dúvidas de definição

4 respostas
R

Pessoal eu gostaria entender o porque de cada um desses pontos abaixo:

*Não podemos ter um método construtor sendo chamado por outro método construtor. Por que?

*Não podemos ter um private no método construtor. Por que?

*Uma classe abstrata não pode ser instanciada. Por que?

4 Respostas

S

1- Podemos sim, mas caso o faça, deve ser a primeira instrução do construtor.

2- Também podemos, mas isso vai impedir que a classe seja instanciada. Isso é usado por um padrão chamado Singleton.

3- Se ela é abstrata, ela não deve “existir”, logo não dá pra criar uma instância (um objeto) dela.

R

Uma classe abstrata tem o intuito de criar uma classe com intenções no futuro, implementar métodos que não serão utilizados no momento, ou querer utiliza-la para extensões de classes, impossibilitando instancia-la diretamente.Pelo próprio nome diz ‘abstrato’. Não é uma classe concreta que pode ser instanciada.

Construtor private:

O java aceita você colocar private como acessibilidade privada ao construtor.

Por exemplo, um dos design patterns como singleton:

Um singleton é uma classe que pode ser instanciada uma única vez, como explicado no livro de Design Patterns da GoF. Normalmente representa um componente que é intrinsicamente único, como uma placa de vídeo ou o sistema de arquivos.

A forma de implementar um singleton é mantendo o construtor privado e provendo um membro estático público para retornar a instância, que pode ser diretamente um campo final da classe ou então um método que retorne essa instância. Ex.:

public class Elvis {

private static final Elvis INSTANCE = new Elvis();
private Elvis() {
        // construtor da classe
    }

    public static Elvis getInstance() {
        return INSTANCE;
    }
}

Para que o singleton seja serializável, também é necessário incluir um método readResolve que descarte a nova instância criada na desserialização, retornando aquela já existente.

Método construtor:
Retirado de http://www.portaljava.com/home/modules.php?name=Content&pa=showpage&pid=46

O que é um construtor padrão(default) ?

[a] O construtor é chamado sem argumentos.
[b] O construto padrão provido pelo compilador Java.
[c] Se você define um construtor numa classe então o construtor padrão não será fornecido.

Exemplo:

classe Base {

public Base() {} 

  public Base(String s){}

}

public class Derived extends Base{

public static void main(String args[]){  
      Derived d = new Derived("Hello"); //Compiler gives error here 
   }

}

Saída:
Derived.java:12: Wrong number of arguments in constructor.
Derived d = new Derived(“Hello”); //Compiler gives error here
^

Para fazer ele funcionar , defina um construtor e chame o construtor da classe base usando super() dentro do contrutor.

Exemplo:

class Base {

public Base() {}

public Base(int i) {}

}

public class Derived extends Base{

public static void main(String arg[]){

Derived m = new Derived(10);

}
Derived(int i) {

super(i);

System.out.println( "The i values i " + i );

}

}

Saída:
The i values i 10

Caso alguém ver algo de errado ao explicar, pode colaborar também…

J
*Não podemos ter um método construtor sendo chamado por outro método construtor. Por que?
Na realidade um construtor SÓ pode ser chamado por outro construtor, alem do operador new.

ex.:

public class Classe1{
   public Classe1(){
      this("abc"); //chamando o outro contrutor
   }

   public Classe1(String teste){

   }
}
*Não podemos ter um private no método construtor. Por que?
Podemos sim. ex.:
public class Classe2{
   private Classe2(){

   }
}

ex. 2:

public class Classe3{
   public Classe3(){
      this("abc");
   }
   public Classe3(String teste){
   }
}
*Uma classe abstrata não pode ser instanciada. Por que?
Porque a classe abstrata não é completa, ou seja, ela tem metodos que não tem corpo, imagine a seguinte classe:
public abstract class Carro{
   public void acelerar();
}

Carro car = new Carro();
car.acelerar(); //mas que codigo será executado???

Agora essa:

public class Ferrari extends Carro{
   public void acelerar(){
      System.out.println("Ferrari acelerando...");
   }
}

Ferrari fer = new Ferrari();
fer.acelerar(); //agora sim tem o que executar...
R

Valeu, pessoal!

Criado 5 de dezembro de 2006
Ultima resposta 7 de dez. de 2006
Respostas 4
Participantes 4