/ / Estenderá criar um objeto de sua superclasse.? - java

Vai estender criar um objeto de sua super classe. - java

Estou confuso com esta pergunta simples. Alguém pode me ajudar com uma resposta válida.

 public class SuperClass{
public SuperClass(){
// may or may not have a constructor for superclass
}
}
public class SubClass extends SuperClass{
// anything here
public static void main(String args[])
{
SubClass sub=new SubClass();
}
}

Agora, minha pergunta é se estou criando um objeto do SubClass faz isso cria um objeto do SuperClass Se sim, por que .. ??

Eu sei que a maioria das pessoas vê essa pergunta como boba. Mas estas são minhas perguntas.

Ele chama o construtor da SuperClasse, então, como isso acontece se um objeto não for criado.?

As extensões aumentam o tamanho da classe? ou seja, SuperClasse + Subclasse. !!

Respostas:

1 para resposta № 1

Agora, minha pergunta é: se estou criando um objeto da subclasse, ele cria um objeto da superclasse? Se sim, por que .. ??

Não, não é.

Quando você faz

SubClass sub=new SubClass();

SubClass objeto criado. E apenas o construtor de super chamadas de classe. E esse chamado para o construtor de super classes acorrentado até o alcance de java.lang.Object construtor.

Nota: Uma regra geral (não sei se é oficial ou não, com cada Novo , apenas um objeto cria)

Você se refere:15.9.4 Avaliação em tempo de execução de expressões de criação de instância de classe

O novo objeto contém novas instâncias de todos oscampos declarados no tipo de classe especificado e em todas as suas superclasses. À medida que cada nova instância de campo é criada, ela é inicializada com seu valor padrão (§4.12.5).

Então você pode chegar a uma conclusão como quando class SubClass extends SuperClass, então métodos, variáveis ​​são copiadas para a classe SubClass .

Editar:

como um construtor pode ser chamado se um objeto não é criado .. ??

Aah ... sua dúvida faz sentido para mim.

Mas constructor é um método muito especial em java. Você pode descompilar um arquivo de classe, pode ver os construtores em nome de <init>. Você não pode ligar explicitamente exceto com palavra-chave new ou super.


1 para resposta № 2

É difícil dar uma resposta simples de sim / não porque depende das definições exatas dos termos que você está usando. Quando voce diz

SubClass sub = new SubClass();

isso criará 1 objeto (sem contar outros objetos criados pelo corpo do construtor ou pela inicialização dos campos membros). O objeto tem um classe de tempo de execução, que será SubClass. Se você diz sub.getClass() == SubClass.class, isso retorna true. Se você diz sub.getClass() == SuperClass.class, isso retorna false. Portanto, nesse sentido, a resposta é não, porque a classe do objeto (runtime) é SubClass, não SuperClass.

No entanto, o novo SubClass O objeto também é considerado uma "instância" de SuperClass; Se você diz sub instanceof SuperClass, esta expressão é true. Você também pode usar sub em qualquer lugar um SuperClass é necessário, por exemplo se você tem uma variável SuperClass s você pode atribuir s = sube se um método precisar de um SuperClass parâmetro, você pode passar sub para isso. No POO, herança (extends em Java) denota uma é um relacionamento e, nesse sentido, um SubClass é um SuperClasse, portanto, sub Além disso é um SuperClass. Mas observe que sua classe de tempo de execução Nunca alterar.

SuperClass s = sub;
boolean b1 = (s.getClass() == SuperClass.class);  // false
boolean b2 = (s.getClass() == SubClass.class);    // true

Obviamente, para responder à pergunta exata "ele cria um objeto da SuperClasse", a resposta poderia ser sim se o construtor se parecer com

public SubClass () {
this.myParent = new SuperClass();
}

Agora o construtor cria um objeto de SubClass e um objeto separado de SuperClass. Mas tenho certeza de que não foi isso que você quis dizer. :)

EDITAR: Para resolver as perguntas que você adicionou posteriormente:

Ele chama o construtor da SuperClasse, então, como isso acontece se um objeto não for criado.?

o SubClass O objeto contém os campos dos membros declarados para SuperClass, mais os campos de membro declarados para o SubClass. (Além dos campos dos membros declarados para Object e qualquer outra superclasse no meio.) Mas ainda é apenas um objeto que contém todos esses campos. SubClass construtor chama um SuperClass construtor, que (provavelmente) inicializa os campos declarados para SuperClass; então o SubClass O construtor pode inicializar os campos declarados para o SubClass.

As extensões aumentam o tamanho da classe? ou seja, SuperClasse + Subclasse. !!

Se novos campos de membros forem declarados no SubClassentão sim, um SubClass presumivelmente usa mais memória, uma vez que possui todos os campos declarados no SuperClass além de todos os campos declarados no SubClass.


0 para resposta № 3

Sua pergunta é um pouco confusa. - Você não cria um objeto SuperClass porque o único objeto criado é um objeto SubClass. - Em outra perspectiva, sim, você cria um objeto SuperClass porque um objeto SubClass é um objeto SuperClass. Em outras palavras, "SuperClass obj = new SubClass ();" é totalmente válido - O construtor de SuperClass é chamado


0 para a resposta № 4

Não, ele não cria Objeto de Superclasse. Embora, como herda da superclasse, ele executa seus blocos de construtor e de discriminação (se houver), e também obtém seu estado e comportamento.