Pergunta

Pode uma classe abstrata tem um construtor?

Se assim for, como pode ser usado e para que fins?

Foi útil?

Solução

Sim, uma classe abstrata pode ter um construtor.Considere isto:

abstract class Product { 
    int multiplyBy;
    public Product( int multiplyBy ) {
        this.multiplyBy = multiplyBy;
    }

    public int mutiply(int val) {
       return multiplyBy * val;
    }
}

class TimesTwo extends Product {
    public TimesTwo() {
        super(2);
    }
}

class TimesWhat extends Product {
    public TimesWhat(int what) {
        super(what);
    }
}

A superclasse Product é abstrata e tem um construtor.A classe do betão TimesTwo tem um construtor que apenas hardcodes o valor 2.A classe do betão TimesWhat tem um construtor que permite que o chamador para especificar o valor.

Resumo de construtores, com freqüência ser utilizados para impor restrições de classe ou invariantes tais como o mínimo de campos necessários para a instalação da classe.

NOTA:Como não existe um padrão (ou arg) construtor do pai classe abstrata, o construtor utilizado na subclasse deve chamar explicitamente o principal construtor.

Outras dicas

Você definiria um construtor em uma classe abstrata se estiver em uma dessas situações:

  • Você deseja realizar alguma inicialização (para campos da classe abstrata) antes da instanciação de uma subclasse realmente ocorre
  • Você definiu campos finais na classe abstrata, mas não os inicializou na própria declaração; Nesse caso, você deve ter um construtor para inicializar esses campos

Observe que:

  • Você pode definir mais de um construtor (com argumentos diferentes)
  • você pode (deveria?) Definir todos os seus construtores protegidos (torná -los públicos é inútil de qualquer maneira)
  • Seu construtor (s) de subclasse pode chamar um construtor da classe abstrata; Pode até tem que Chame (se não houver um construtor não-Arg na classe abstrata)

De qualquer forma, não esqueça que, se você não definir um construtor, o compilador gerará automaticamente um para você (este é público, não tem argumento e não fará nada).

Sim, ele pode ter um construtor e é definido e se comporta como o construtor de qualquer outra classe. Exceto que classes abstratas não podem ser instantadas diretamente, apenas estendidas, portanto, o uso é sempre do construtor de uma subclasse.

Sim! Classes abstratas podem ter construtores!

Sim, quando definimos uma classe como uma classe abstrata, ela não pode ser instanciada, mas isso não significa que uma classe abstrata não possa ter um construtor. Cada classe abstrata deve ter uma subclasse concreta que implementará os métodos abstratos dessa classe abstrata.

Quando criamos um objeto de qualquer subclasse, todos os construtores na árvore de herança correspondentes são invocados na abordagem de cima para baixo. O mesmo caso se aplica a classes abstratas. Embora não possamos criar um objeto de uma classe abstrata, quando criamos um objeto de uma classe que é concreto e subclasse da classe abstrata, o construtor da classe abstrata é invocado automaticamente. Portanto, podemos ter um construtor em classes abstratas.

NOTA: Uma classe não abstracida não pode ter métodos abstratos, mas uma classe abstrata pode ter um método não abstrato. A razão é semelhante à dos construtores, sendo a diferença em vez de ser invocado automaticamente, podemos chamar super (). Além disso, não há nada como um construtor abstrato, pois não faz sentido.

Não só pode, sempre pode. Se você não especificar um, ele possui um construtor padrão no ARG, como qualquer outra classe. De fato, todas as classes, incluindo classes anônimas e anônimas, receberão um construtor padrão se não for especificado (no caso de aulas anônimas, é impossível especificar um, para que você sempre obtenha o construtor padrão).

Um bom exemplo de uma classe abstrata com um construtor é o Calendário classe. Você obtém um objeto de calendário chamando calendário.getInstance (), mas também possui construtores protegidos. A razão pela qual seus construtores estão protegidos é para que apenas suas subclasses possam chamá -las (ou classes no mesmo pacote, mas como é abstrato, isso não se aplica). Calendário gregoriano é um exemplo de uma classe que estende o calendário.

Sim

Uma classe abstrata pode ter um construtor, mas você não pode criar um objeto de classe abstrata. Como você usa esse construtor?

A coisa é que, quando você herda essa classe abstrata em sua subclasse, pode passar valores para o construtor (resumo) através do método Super (Value) na sua subclasse e não, você não herda um construtor.

Portanto, usando o Super, você pode passar valores em um construtor da classe abstrata e, até onde eu me lembro, deve ser a primeira declaração em seu método ou construtor.

Embora existam muitas boas respostas, gostaria de dar meus 2 centavos.

Construtor Não constrói o objeto. É usado para inicializar um objeto.

Sim, uma classe abstrata sempre tem um construtor. Se você não definir seu próprio construtor, o compilador fornecerá um construtor padrão para a classe abstrata. Acima é verdadeiro para todas as classes - aninhadas, abstratas, anônimas, etc.

Uma classe abstrata (diferentemente da interface) pode ter campos não estáticos não finais que precisam de inicialização. Você pode escrever seu próprio construtor na classe abstrata para fazer isso. Mas, nesse caso, não haverá nenhum construtor padrão.

public abstract class Abs{
    int i;
    int j;
    public Abs(int i,int j){
        this.i = i;
        this.j = j;
        System.out.println(i+" "+j);
    }
}

Tenha cuidado ao se estender acima da classe abstrata, você deve chamar explicitamente super de cada construtor. A primeira linha de qualquer construtor chama para super (). Se você não ligar explicitamente super (), o Java fará isso por você. Abaixo o código não será compilação:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    System.out.println("2 arg");
}
}

Você tem que usá -lo como o exemplo abaixo:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    super(i,j);
    System.out.println("2 arg");
}
}

Obviamente, a classe abstrata pode ter um construtor. O construtor de classe generalmente é usado para inicializar os campos. Então, um construtor de classe abstrato é usado para inicializar campos da classe abstrata. Você forneceria um construtor para uma classe abstrata se desejar inicializar certos campos da classe abstrata antes que a instanciação de uma classe infantil ocorra. Um construtor de classe abstrato também pode ser usado para executar o código relevante para cada classe infantil. Isso evita a duplicação do código.

Não podemos criar uma instância de uma classe abstrata, mas podemos criar instâncias de classes que são derivadas da classe abstrata. Portanto, quando uma instância da classe derivada é criada, o construtor de classe abstrato dos pais é chamado automaticamente.

Referência:Este artigo

Considere isto:

abstract class Product { 
    int value;
    public Product( int val ) {
        value= val;
    }
    abstract public int multiply();
}

class TimesTwo extends Product {
    public int mutiply() {
       return value * 2;
    }
}

A superclasse é abstrata e possui um construtor.

Em uma classe de concreto, a declaração de um construtor para um tipo de concreto expõe efetivamente duas coisas:

  • Um meio pelo qual o código pode solicitar a criação de uma instância de fnord

  • Um meio pelo qual uma instância de um tipo derivado de fnord que está em construção pode solicitar que todos os recursos da classe base sejam inicializados.

Embora talvez deva haver um meio pelo qual essas duas habilidades possam ser controladas separadamente, para cada definição concreta do tipo um permitirá ambos. Embora a primeira habilidade não seja significativa para uma classe abstrata, a segunda habilidade é tão significativa para uma classe abstrata quanto para qualquer outra, e, portanto, sua declaração é igualmente necessária e útil.

Sim, ele é. E um construtor de classe abstrato é chamado quando uma instância de uma classe herdada é criada. Por exemplo, a seguir é um programa Java válido.

// An abstract class with constructor
abstract class Base {
Base() { System.out.println("Base Constructor Called"); }
abstract void fun();
    }
class Derived extends Base {
Derived() { System.out.println("Derived Constructor Called"); }
void fun() { System.out.println("Derived fun() called"); }
    }

class Main {
public static void main(String args[]) { 
   Derived d = new Derived();
    }

}

Esta é a saída do código acima,

Construtor de base chamado construtor derivado chamado

referências:Digite a descrição do link aqui

Conforme descrito por Javafuns aqui, isto é um exemplo:

public abstract class TestEngine
{
   private String engineId;
   private String engineName;

   public TestEngine(String engineId , String engineName)
   {
     this.engineId = engineId;
     this.engineName = engineName;
   }
   //public gettors and settors
   public abstract void scheduleTest();
}


public class JavaTestEngine extends TestEngine
{

   private String typeName;

   public JavaTestEngine(String engineId , String engineName , String typeName)
   {
      super(engineId , engineName);
      this.typeName = typeName;
   }

   public void scheduleTest()
   {
     //do Stuff
   }
}

Sim, as aulas abstratas podem ter construtores!

Aqui está um exemplo usando o construtor na classe abstrata:

abstract class Figure { 

    double dim1;        
    double dim2; 

    Figure(double a, double b) {         
        dim1 = a;         
        dim2 = b;         
    }

    // area is now an abstract method 

   abstract double area(); 

}


class Rectangle extends Figure { 
    Rectangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for rectangle 
    double area() { 
        System.out.println("Inside Area for Rectangle."); 
        return dim1 * dim2; 
    } 
}

class Triangle extends Figure { 
    Triangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for right triangle 
    double area() { 
        System.out.println("Inside Area for Triangle."); 
        return dim1 * dim2 / 2; 
    } 
}

class AbstractAreas { 
    public static void main(String args[]) { 
        // Figure f = new Figure(10, 10); // illegal now 
        Rectangle r = new Rectangle(9, 5); 
        Triangle t = new Triangle(10, 8); 
        Figure figref; // this is OK, no object is created 
        figref = r; 
        System.out.println("Area is " + figref.area()); 
        figref = t; 
        System.out.println("Area is " + figref.area()); 
    } 
}

Então eu acho que você recebeu a resposta.

Classe abstrata pode ter um construtor que ele não pode ser instanciada.Mas o construtor definido em uma classe abstrata pode ser usado para a instanciação da classe concreta desta classe abstrata.Seleção JLS:

É um erro em tempo de compilação, se for feita uma tentativa para criar uma instância de uma classe abstrata usando uma instância da classe criação expressão.

Uma subclasse de uma classe abstrata que não é, em si resumo pode ser instanciado, o que resulta na execução de um construtor para a a classe abstrata e, por conseguinte, a execução de campo de inicializadores para variáveis de instância da classe.

Desde um a classe abstrata pode ter variáveis de todos os modificadores de acesso, devem ser inicializados com valores padrão, então construtor é necessário.Como você instanciar a criança de classe, um construtor de uma classe abstrata é invocado e variáveis são inicializadas.

Pelo contrário, uma interface contém apenas variáveis constantes que significa que eles já estão inicializado.Assim, a interface não precisa de um construtor.

Para alcançar o encadeamento do construtor, a classe abstrata terá um construtor. O compilador mantém a instrução super () dentro do construtor subclasse, que chamará o construtor de superclass. Se não houvesse construtores para classes abstratas, as regras Java são violadas e não podemos alcançar o encadeamento do construtor.

Sim, uma Classe Abstrata pode ter um Construtor.Você Pode sobrepor-se como muitos como Construtor de uma Classe Abstrata.Estes operadores Podem ser usados para inicializar o estado inicial dos Objetos Estender a Classe Abstrata.Como sabemos que não podemos criar um objeto de uma Classe Abstrata porque os Objetos são Criados pelas "novas" palavras-chave e não pelos construtores...eles estão lá apenas para inicializar o estado da subclasse Objetos.

Sim, certamente, você pode adicionar um, como já mencionado para a inicialização da classe Abstrata variáveis.MAS se você não declarar explicitamente um, de qualquer forma tem um construtor implícito de "Construtor de Encadeamento" para o trabalho.

O objetivo do construtor em uma classe é usado para Inicialize os campos mas não para "construir objetos". Quando você tenta criar uma nova instância de uma superclasse abstrata, o compilador lhe dará um erro. No entanto, podemos herdar um funcionário da classe abstrato e fazer uso de seu construtor definindo suas variáveis, veja o exemplo abaixo

public abstract class Employee {
  private String EmpName;
  abstract double calcSalary();

  Employee(String name) {
    this.EmpName = name;// constructor of abstract class super class
  }
}

class Manager extends Employee{
 Manager(String name) {
    super(name);// setting the name in the constructor of sub class
 }
double calcSalary() {
    return 0;
 }
}

Sim ... é como qualquer outra classe. Pode ter um construtor e é chamado após a criação de objeto para a classe base.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top