Construtores e inheritance padrão em Java

Eu tenho uma pergunta sobre construtores padrão e inheritance em Java.

Geralmente, se você escreve uma class e não inclui nenhum construtor, Java fornece automaticamente para você um construtor padrão (um sem parâmetros), que inicializa todas as variables ​​de instância da class (se houver alguma) com alguns valores padrão (0, null , ou falso). Se você escrever um construtor, no entanto, com alguns parâmetros e não escrever nenhum construtor padrão, o Java não fornecerá um construtor padrão. Minha pergunta é: qual é o caso das classs, que herdam de outras classs – se eu escrevo um construtor com alguns parâmetros nelas, mas não incluo um construtor padrão, elas herdam o construtor padrão da superclass?

  1. Se você não fizer um construtor, o construtor vazio padrão será criado automaticamente .

  2. Se algum construtor não chamar explicitamente um super ou um construtor como sua primeira instrução, uma chamada para super () será automaticamente incluída .

Sempre.

Construtores não são herdados.

Além disso, a boot dos campos é feita pela máquina virtual, não pelo construtor padrão. O construtor padrão apenas invoca o construtor padrão da superclass e o construtor padrão de Object está vazio. O bom ponto desse design é que não há como acessar campos não inicializados.

A menos que você use super (…), um construtor chama o construtor vazio de seu pai. Nota: Ele faz isso em todas as suas classs, mesmo as que estendem o object.

Isso não é herdado, as subclasss não recebem os mesmos construtores com os mesmos argumentos. No entanto, você pode adicionar construtores que chamam um dos construtores da superclass.

A regra básica é uma chamada (ou invocação) para um construtor deve ser a primeira instrução que a JVM precisa executar,

Portanto, quando você tem uma superclass com apenas um construtor parametrizado e nenhum construtor padrão, e a class base não possui uma chamada explícita para o construtor parametrizado da superclass, a JVM fornece o super (); chamada que lança erro, pois não existe um construtor padrão para a superclass, portanto, nós fornecemos um construtor padrão na superclass ou explicitamente chamamos o construtor parametrizado da superclass no construtor da class base. quando damos a chamada explícita, então a JVM não se preocupa em colocar a linha super (); como invocação de construtor deve ser a primeira declaração do método, o que não pode acontecer (por causa de nossa chamada explícita).

A Seção 8.8.9 da especificação da linguagem Java explica detalhadamente o que está acontecendo:

Se uma class não contiver declarações de construtor, um construtor padrão será implicitamente declarado. A forma do construtor padrão para uma class de nível superior, uma class de membro ou uma class local é a seguinte:

  • O construtor padrão tem a mesma acessibilidade que a class (§6.6).
  • O construtor padrão não possui parâmetros formais, exceto em uma class de membro interna não privada, em que o construtor padrão declara implicitamente um parâmetro formal representando a instância imediatamente envolvente da class (§8.8.1, §15.9.2, §15.9.3 ).
  • O construtor padrão não possui cláusulas throws.
  • Se a class que está sendo declarada for a class primordial Object, o construtor padrão terá um corpo vazio. Caso contrário, o construtor padrão simplesmente invoca o construtor da superclass sem argumentos.

Você pode ver que não há inheritance acontecendo aqui: tudo o que existe é a “magia do compilador” com o construtor padrão declarado implicitamente. A especificação também deixa claro que o construtor padrão é adicionado somente quando a class não possui nenhum construtor, significando que a resposta para sua pergunta é “não”: uma vez que você dá a uma class um construtor, o access ao construtor padrão de sua superclass está perdida.

Se você fornecer um construtor, o Java não gerará um construtor vazio padrão. Portanto, sua class derivada só poderá chamar seu construtor.

O construtor padrão não inicializa suas variables ​​privadas para valores padrão. A prova é que é possível escrever uma class que não tenha um construtor padrão e tenha seus membros privados inicializados com valores padrão. Aqui está um exemplo:

 public class Test { public String s; public int i; public Test(String s, int i) { this.s = s; this.i = i; } public Test(boolean b) { // Empty on purpose! } public String toString() { return "Test (s = " + this.s + ", i = " + this.i + ")"; } public static void main (String [] args) { Test test_empty = new Test(true); Test test_full = new Test("string", 42); System.out.println("Test empty:" + test_empty); System.out.println("Test full:" + test_full); } } 

Thumb Regra é que Sub Class deve chamar qualquer construtor da class base. Então, se você não tem o padrão const, chame o existente da subclass. de outra forma, implementar o const vazio na class base para evitar o problema de compilation

A resposta para sua pergunta é muito simples. Implicitamente (Invisible), a primeira instrução em qualquer construtor é ‘super ();’ isto é, a chamada para o construtor de parâmetro no da class super, até que você altere explicitamente para algo como ‘this ();’, this (int) ‘,’ this (String) ‘,’ super (int) ‘,’ super (String ) ‘etc.’ this (); ‘ é o construtor da class atual.

Quando não criamos um construtor, o Java cria um construtor padrão automaticamente. Mas quando criamos um ou mais construtores personalizados com argumentos, o Java não cria nenhum construtor padrão. Se criarmos um ou mais construtores e quisermos criar um object sem nenhum argumento de construtor, temos que declarar um construtor vazio.

Haverá erro de tempo de compilation … porque o compilador procura construtor padrão ele Superclass e se não está lá … é um erro … e programa não irá compilar …