NOTA: no primeiro caso, a classe pai deve ter um construtor sem argumento que irá gerar um erro de compilação.
KNU
Lembrete: A terminologia pai / filho não é muito boa para hierarquias de classe. (A criança não é um pai.)
aioobe
Existem restrições sobre onde o super pode ser usado?
Aaron Franke
2
@VivekChavda, com certeza uma criança pode ser mãe, assim como um aluno pode ser professor etc. Mas acho que você entende a diferença em comparação com Animal -> Dog, por exemplo. Um cão é necessariamente um animal. Pai / filho é tipicamente um tem uma relação ( "Um pai tem uma criança"), enquanto um cão / animal é um "é um" relacionamento. Veja aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe
2
@AaronFranke, "Existem restrições sobre onde o super pode ser usado?" - Sim, super(...)só pode ser usado como a primeira instrução em um construtor.
aioobe
154
Alguns fatos:
super() é usado para chamar o pai imediato.
super() pode ser usado com membros da instância, ou seja, variáveis e métodos da instância.
super() pode ser usado dentro de um construtor para chamar o construtor da classe pai.
OK, agora vamos praticamente implementar esses pontos de super().
Confira a diferença entre os programas 1 e 2. Aqui, o programa 2 prova nossa primeira declaração super()em Java.
Programa 1
classBase{int a =100;}classSup1extendsBase{int a =200;voidShow(){System.out.println(a);System.out.println(a);}publicstaticvoid main(String[] args){newSup1().Show();}}
Resultado:
200
200
Agora confira o programa 2 e tente descobrir a principal diferença.
Programa 2
classBase{int a =100;}classSup2extendsBase{int a =200;voidShow(){System.out.println(super.a);System.out.println(a);}publicstaticvoid main(String[] args){newSup2().Show();}}
Resultado:
100
200
No programa 1, a saída era apenas da classe derivada. Não foi possível imprimir a variável nem da classe base nem da classe pai. Mas no programa 2, usamos super()a variável aao imprimir sua saída e, em vez de imprimir o valor da variável ada classe derivada, ele imprimiu o valor da variável ada classe base. Portanto, isso prova que super()é usado para chamar o pai imediato.
OK, verifique agora a diferença entre o programa 3 e o programa 4.
Programa 3
classBase{int a =100;voidShow(){System.out.println(a);}}classSup3extendsBase{int a =200;voidShow(){System.out.println(a);}publicstaticvoidMain(String[] args){newSup3().Show();}}
Resultado:
200
Aqui a saída é 200. Quando chamamos Show(), a Show()função da classe derivada foi chamada. Mas o que devemos fazer se quisermos chamar a Show()função da classe pai? Confira o programa 4 para a solução.
Programa 4
classBase{int a =100;voidShow(){System.out.println(a);}}classSup4extendsBase{int a =200;voidShow(){super.Show();System.out.println(a);}publicstaticvoidMain(String[] args){newSup4().Show();}}
Resultado:
100
200
Aqui estamos obtendo duas saídas, 100 e 200. Quando a Show()função da classe derivada é invocada, ela primeiro chama a Show()função da classe pai, porque, dentro da Show()função da classe derivada, chamamos a Show()função da classe pai colocando a superpalavra - chave antes do nome da função.
Por que você não recuou seus exemplos de código fonte? Existe um motivo específico?
Erikbwork 22/09/10
NÃO erikb, eu quero saber o uso de super (). Daqui em diante só eu vou
Mohan
Na minha classe base eu sobrecarrego o construtor com um, dois, ... argumentos
Mohan
mas na minha classe derivada eu uso super () sem nenhuma discussão. então o que vai acontecer se ele é automaticamente chama um construtor padrão de uma classe base
Mohan
2
super()não é uma palavra-chave. É uma invocação de construtor. superé uma palavra-chave e os nºs 1 e 2 só fazem sentido com essa definição.
Sim. super(...)invocará o construtor da superclasse.
Ilustração:
Exemplo independente:
classAnimal{publicAnimal(String arg){System.out.println("Constructing an animal: "+ arg);}}classDogextendsAnimal{publicDog(){super("From Dog constructor");System.out.println("Constructing a dog.");}}publicclassTest{publicstaticvoid main(String[] a){newDog();}}
Impressões:
Constructing an animal:FromDog constructor
Constructing a dog.
Na minha classe base, sobrecarrego o construtor com um, dois, ... argumentos na minha classe derivada, uso super () sem nenhuma discussão. então o que vai acontecer se ele é automaticamente chama um construtor padrão de uma classe base
Mohan
Sim. Se você chamar super(), chamará o construtor da superclasse que não aceita argumentos. Da mesma forma, ele invocará o construtor de 1 argumento, se você o fizer super(arg1), e assim por diante.
Aioobe
se não houvesse construtor sem nenhuma discussão na classe base, o que aconteceria se a classe derivada chamar super ().
Mohan
1
Nada. Não será compilado. Se você mesmo fornecer um construtor, o construtor automático / padrão / sem argumento não será gerado, portanto super(), não será uma chamada válida.
precisa saber é
29
É super () usado para chamar o construtor pai?
Sim.
Pls explica sobre Super ().
super()é um uso especial da superpalavra - chave em que você chama um construtor pai sem parâmetros. Em geral, a superpalavra - chave pode ser usada para chamar métodos substituídos, acessar campos ocultos ou chamar o construtor de uma superclasse.
super()é usado para chamar o construtor pai, super.myMethod()é usado para chamar um método substituído.
Sean Patrick Floyd
2
@seanizer ou qualquer outro método da superclasse (incluindo estática) se estiver no escopo. super é apenas uma referência à sua classe base.
precisa saber é o seguinte
3
Eu não acho que super () é usado para chamar métodos de classe base. Você pode usar super.method ().
Dheeraj Joshi
@seanizer, @Dheeraj: Obrigado pelo seu feedback, eu adaptei minha resposta.
Heinzi 22/09/10
7
Chamar o super construtor sem argumentos é apenas um desperdício de espaço na tela e tempo do programador. O compilador gera exatamente o mesmo código, independentemente de você o escrever ou não.
Apenas super (); sozinho chamará o construtor padrão, se existir da superclasse de uma classe. Mas você deve escrever explicitamente o construtor padrão. Se você não um Java, irá gerar um para você sem implementações, salve super (); , referindo-se ao objeto universal da superclasse e você não pode chamá-lo em uma subclasse.
publicclassAlien{publicAlien(){//Default constructor is written out by user/** Implementation not shown…**/}}publicclassWeirdAlienextendsAlien{publicWeirdAlien(){super();//calls the default constructor in Alien.}}
Gostaria de compartilhar com os códigos tudo o que entendi.
A super palavra-chave em java é uma variável de referência usada para referenciar objetos de classe pai. É usado principalmente nos seguintes contextos: -
1. Uso de super com variáveis:
classVehicle{int maxSpeed =120;}/* sub class Car extending vehicle */classCarextendsVehicle{int maxSpeed =180;void display(){/* print maxSpeed of base class (vehicle) */System.out.println("Maximum Speed: "+super.maxSpeed);}}/* Driver program to test */classTest{publicstaticvoid main(String[] args){Car small =newCar();
small.display();}}
Resultado:-
MaximumSpeed:120
Uso de super com métodos:
/* Base class Person */classPerson{void message(){System.out.println("This is person class");}}/* Subclass Student */classStudentextendsPerson{void message(){System.out.println("This is student class");}// Note that display() is only in Student class void display(){// will invoke or call current class message() method
message();// will invoke or call parent class message() method super.message();}}/* Driver program to test */classTest{publicstaticvoid main(String args[]){Student s =newStudent();// calling display() of Student
s.display();}}
Resultado:-
This is student classThis is person class
3. Uso de super com construtores:
classPerson{Person(){System.out.println("Person class Constructor");}}/* subclass Student extending the Person class */classStudentextendsPerson{Student(){// invoke or call parent class constructor super();System.out.println("Student class Constructor");}}/* Driver program to test*/classTest{publicstaticvoid main(String[] args){Student s =newStudent();}}
Construtores
Em um construtor, você pode usá-lo sem um ponto para chamar outro construtor. superchama um construtor na superclasse; thischama um construtor nesta classe:
publicMyClass(int a){this(a,5);// Here, I call another one of this class's constructors.}publicMyClass(int a,int b){super(a, b);// Then, I call one of the superclass's constructors.}
superé útil se a superclasse precisar se inicializar. thisé útil para permitir que você escreva todo o código de inicialização permanente apenas uma vez em um dos construtores e chame-o de todos os outros, construtores muito mais fáceis de escrever.
Métodos
Em qualquer método, você pode usá-lo com um ponto para chamar outro método. super.method()chama um método na superclasse; this.method()chama um método nesta classe:
publicString toString(){int hp =this.hitpoints();// Calls the hitpoints method in this class// for this object.String name =super.name();// Calls the name method in the superclass// for this object.return"["+ name +": "+ hp +" HP]";}
superé útil em um determinado cenário: se sua classe possui o mesmo método que sua superclasse, o Java assumirá que você deseja aquele em sua classe; superpermite que você solicite o método da superclasse. thisé útil apenas como uma maneira de tornar seu código mais legível.
A super palavra - chave pode ser usada para chamar o construtor da superclasse e se referir a um membro da superclasse
Quando você chama super () com os argumentos corretos, na verdade chamamos o construtor Box , que inicializa as variáveis width , height e depth , referenciado a ele usando os valores dos parâmetros correspondentes. Você só resta inicializar seu peso com valor agregado. Se necessário, agora você pode classificar as variáveis Box como privadas . Coloque nos campos do modificador privado da classe Box e verifique se você pode acessá-los sem problemas.
Na superclasse pode haver vários construtores de versões sobrecarregadas, para que você possa chamar o método super () com parâmetros diferentes. O programa executará o construtor que corresponde aos argumentos especificados.
super é uma palavra-chave. É usado dentro de uma definição de método de subclasse para chamar um método definido na superclasse. Métodos particulares da superclasse não podem ser chamados. Somente métodos públicos e protegidos podem ser chamados pela super palavra-chave. Também é usado pelos construtores de classe para invocar construtores de sua classe pai.
Como afirmado, dentro do construtor padrão, há um super () implícito chamado na primeira linha do construtor.
Esse super () chama automaticamente uma cadeia de construtores começando no topo da hierarquia de classes e desce a hierarquia.
Se houvesse mais de duas classes na hierarquia de classes do programa, o construtor padrão de primeira classe seria chamado primeiro .
Aqui está um exemplo disso:
class A {
A(){System.out.println("Constructor A");}}class B extends A{public B(){System.out.println("Constructor B");}}class C extends B{public C(){System.out.println("Constructor C");}publicstaticvoid main(String[] args){
C c1 =new C();}}
Respostas:
super()
chama o construtor pai sem argumentos.Também pode ser usado com argumentos. Ou seja,
super(argument1)
e ele chamará o construtor que aceita 1 parâmetro do tipo deargument1
(se existir).Também pode ser usado para chamar métodos do pai. Ou seja,
super.aMethod()
Mais informações e tutorial aqui
fonte
super(...)
só pode ser usado como a primeira instrução em um construtor.Alguns fatos:
super()
é usado para chamar o pai imediato.super()
pode ser usado com membros da instância, ou seja, variáveis e métodos da instância.super()
pode ser usado dentro de um construtor para chamar o construtor da classe pai.OK, agora vamos praticamente implementar esses pontos de
super()
.Confira a diferença entre os programas 1 e 2. Aqui, o programa 2 prova nossa primeira declaração
super()
em Java.Programa 1
Resultado:
Agora confira o programa 2 e tente descobrir a principal diferença.
Programa 2
Resultado:
No programa 1, a saída era apenas da classe derivada. Não foi possível imprimir a variável nem da classe base nem da classe pai. Mas no programa 2, usamos
super()
a variávela
ao imprimir sua saída e, em vez de imprimir o valor da variávela
da classe derivada, ele imprimiu o valor da variávela
da classe base. Portanto, isso prova quesuper()
é usado para chamar o pai imediato.OK, verifique agora a diferença entre o programa 3 e o programa 4.
Programa 3
Resultado:
Aqui a saída é 200. Quando chamamos
Show()
, aShow()
função da classe derivada foi chamada. Mas o que devemos fazer se quisermos chamar aShow()
função da classe pai? Confira o programa 4 para a solução.Programa 4
Resultado:
Aqui estamos obtendo duas saídas, 100 e 200. Quando a
Show()
função da classe derivada é invocada, ela primeiro chama aShow()
função da classe pai, porque, dentro daShow()
função da classe derivada, chamamos aShow()
função da classe pai colocando asuper
palavra - chave antes do nome da função.fonte
super()
não é uma palavra-chave. É uma invocação de construtor.super
é uma palavra-chave e os nºs 1 e 2 só fazem sentido com essa definição.Artigo de origem: Java: Calling super ()
Sim.
super(...)
invocará o construtor da superclasse.Ilustração:
Exemplo independente:
Impressões:
fonte
super()
, chamará o construtor da superclasse que não aceita argumentos. Da mesma forma, ele invocará o construtor de 1 argumento, se você o fizersuper(arg1)
, e assim por diante.super()
, não será uma chamada válida.Sim.
super()
é um uso especial dasuper
palavra - chave em que você chama um construtor pai sem parâmetros. Em geral, asuper
palavra - chave pode ser usada para chamar métodos substituídos, acessar campos ocultos ou chamar o construtor de uma superclasse.Aqui está o tutorial oficial
fonte
super()
é usado para chamar o construtor pai,super.myMethod()
é usado para chamar um método substituído.Chamar o super construtor sem argumentos é apenas um desperdício de espaço na tela e tempo do programador. O compilador gera exatamente o mesmo código, independentemente de você o escrever ou não.
fonte
Sim,
super()
(em minúsculas) chama um construtor da classe pai. Você pode incluir argumentos:super(foo, bar)
Há também uma
super
palavra - chave, que você pode usar em métodos para chamar um método da superclasseUm rápido google para "Java super" resulta neste
fonte
Está correto. Super é usado para chamar o construtor pai. Então, suponha que você tenha um bloco de código assim
Em seguida, você pode atribuir um valor à variável de membro n.
fonte
Eu já vi todas as respostas. Mas todo mundo esqueceu de mencionar um ponto muito importante:
super () deve ser chamado ou usado na primeira linha do construtor.
fonte
Apenas super (); sozinho chamará o construtor padrão, se existir da superclasse de uma classe. Mas você deve escrever explicitamente o construtor padrão. Se você não um Java, irá gerar um para você sem implementações, salve super (); , referindo-se ao objeto universal da superclasse e você não pode chamá-lo em uma subclasse.
fonte
Por exemplo, na automação de selênio, você tem um PageObject que pode usar o construtor de seus pais assim:
fonte
Gostaria de compartilhar com os códigos tudo o que entendi.
A super palavra-chave em java é uma variável de referência usada para referenciar objetos de classe pai. É usado principalmente nos seguintes contextos: -
1. Uso de super com variáveis:
Resultado:-
Resultado:-
3. Uso de super com construtores:
Resultado:-
fonte
Construtores
Em um construtor, você pode usá-lo sem um ponto para chamar outro construtor.
super
chama um construtor na superclasse;this
chama um construtor nesta classe:super
é útil se a superclasse precisar se inicializar.this
é útil para permitir que você escreva todo o código de inicialização permanente apenas uma vez em um dos construtores e chame-o de todos os outros, construtores muito mais fáceis de escrever.Métodos
Em qualquer método, você pode usá-lo com um ponto para chamar outro método.
super.method()
chama um método na superclasse;this.method()
chama um método nesta classe:super
é útil em um determinado cenário: se sua classe possui o mesmo método que sua superclasse, o Java assumirá que você deseja aquele em sua classe;super
permite que você solicite o método da superclasse.this
é útil apenas como uma maneira de tornar seu código mais legível.fonte
A super palavra - chave pode ser usada para chamar o construtor da superclasse e se referir a um membro da superclasse
Quando você chama super () com os argumentos corretos, na verdade chamamos o construtor Box , que inicializa as variáveis width , height e depth , referenciado a ele usando os valores dos parâmetros correspondentes. Você só resta inicializar seu peso com valor agregado. Se necessário, agora você pode classificar as variáveis Box como privadas . Coloque nos campos do modificador privado da classe Box e verifique se você pode acessá-los sem problemas.
Na superclasse pode haver vários construtores de versões sobrecarregadas, para que você possa chamar o método super () com parâmetros diferentes. O programa executará o construtor que corresponde aos argumentos especificados.
fonte
super é uma palavra-chave. É usado dentro de uma definição de método de subclasse para chamar um método definido na superclasse. Métodos particulares da superclasse não podem ser chamados. Somente métodos públicos e protegidos podem ser chamados pela super palavra-chave. Também é usado pelos construtores de classe para invocar construtores de sua classe pai.
Verifique aqui para mais explicações.
fonte
Como afirmado, dentro do construtor padrão, há um super () implícito chamado na primeira linha do construtor.
Esse super () chama automaticamente uma cadeia de construtores começando no topo da hierarquia de classes e desce a hierarquia.
Se houvesse mais de duas classes na hierarquia de classes do programa, o construtor padrão de primeira classe seria chamado primeiro .
Aqui está um exemplo disso:
O acima resultaria:
fonte