[resolvido] Construtores, super classes

Estou lendo o use a cabeça Java, e dei uma travada aqui na pagina 183.
Seguinte… na parte, Poder do Cérebro diz o seguinte.

E quanto às superclasses?
Quando voce criar um objeto Dog, o construtor de Canine também deve ser executado?
Se a superclasse for abstrata, ela deve ter um construtor?
Examinaremos isso nas proximas páginas, portanto, faça uma pausa agora e pense nas implicações existentes entre os construtores e as superclasses.

Nota* nao é lição de casa (rs)…
Não entendi mesmo nem por onde começar a pensar… nao entendi a questao de um construtor dentro da canine se deve ser executado. Porque executado se o objeto é Dog??

denisspitfire toda classe abstrata nunca será instanciada diretamente e sim através de uma classe que extendê-la e nisso é obrigatório incluir um contrutor nessa e dentro dela inserir o comando super(); para instanciar a classe pai e permitir compartilhar seus métodos ou atributos entre a classe pai com a filha.

exemplo prático:

public abstract class Funcionario {
         // Esse construtor somente será acessado pelo comando super() existente no construtor de uma classe filha que "extender" essa classe.
         public Funcionario(){

                  System.out.println("Instanciou um funcionario!");
         }
}

public class Gerente extends Funcionario {

       public Gerente(){
                super();
                System.out.println("Instanciou um Gerente!");
       }
}

espero ter ajudado, qualquer outra dúvida é só falar!! XD

Oi!

Canine dog = new Dog();

O construtor de Canine será executado, concorda? :slight_smile:

Mas você pode simplesmente fazer:

Canine dog = new Canine()

Edit: segue o que o romarcio disse, está correto.

Abraços.

Pelo que entendi a classe Canine é a superclasse de Dog.
Toda classe tem pelo menos 1 construtor.
Quando uma subclasse como Dog é executada, seu construtor é executado e a 1ª instrução do construtor de Dog a ser executada é uma chamada a super().
super() faz uma chamada ao construtor da superclasse, no caso Canine. Sempre que uma subclasse for executada, o construtor da super classe também será executado.

Da uma lida nesse artigo: http://wp.me/p1iE6J-q

nel nesse caso uma classe esta utilizando tecnica de polimorfismo, e nisso ambas as classes são concretas e não uma classe abstrata. Ai nesse caso tbm é valido fazer o que vc citou, porém caso seja considerado que a classe Canine seja abstrata não será possível fazer essa instância:

Canine canine = new Canine();

somente será correto fazer:

Canine canine = new Dog(); 

pq Dog é uma classe concreta.

VLW gente é isso mesmo

Tipo não entendi a sua explicação, toda classe tem um construtor default, sendo assim, você não é obrigado a incluir um construtor para ter acesso aos atributos tanto da classe pai como da classe filha…

veja o exemplo:

Classe pai abstrata:

[code]public abstract class ClassPai {

private String atributoPai;

public String getAtributoPai() {
	return atributoPai;
}
public void setAtributoPai(String atributoPai) {
	this.atributoPai = atributoPai;
}

}[/code]

Classe filha extendendo da classe pai abstrata:

[code]public class ClassFilha extends ClassPai {

private String atributoFilha;

public String getAtributoFilha() {
	return atributoFilha;
}

public void setAtributoFilha(String atributoFilha) {
	this.atributoFilha = atributoFilha;
}

}[/code]

Classe de teste com os comentários a respeito:

[code]public class ClassTeste {
/**
* @param args
*/
public static void main(String[] args) {
//Acesso somente os atributos da classe pai porque minha variavel de referência
//é do tipo ClassPai!
ClassPai testePai = new ClassFilha();

	//Acesso tanto os atributos da classe pai como a filha:
	ClassFilha testeFilha = new ClassFilha();
}

}[/code]

Falo !!

Gente esse Post me ajudou a entender melhor como funciona esse negocio de Construtores no Java
http://mballem.wordpress.com/2011/01/19/declaracao-de-construtores-em-java/

RodrigoM91 pegando o seu codigo como exemplo, oq estava querendo dizer sobre o q vc nao entendeu é a respeito da instancia e não do que uma classe pai ou filha pode acessar.

como exemplo o no seu codigo:

public class ClassTeste {  
  
    public static void main(String[] args) {  
        
        // Instancia correta
        ClassPai testePai = new ClassFilha();  // <-- CORRETO
  
        //Instancia correta  
        ClassFilha testeFilha = new ClassFilha();  // <-- CORRETO

        // Instancia Incorreta
        ClassPai testePai = new ClassPai();  // <-- ERRADO 
    }  
} 

pois uma classe abstrata nao pode ela msma ser instancia diretamente e sim utilizando o comando super() dentro de um contrutor de uma classe filha, foi mais ou menos isso que estava explicando para o denisspitfire

[quote=caio.ribeiro.pereira]RodrigoM91 pegando o seu codigo como exemplo, oq estava querendo dizer sobre o q vc nao entendeu é a respeito da instancia e não do que uma classe pai ou filha pode acessar.

como exemplo o no seu codigo:

public class ClassTeste {  
  
    public static void main(String[] args) {  
        
        // Instancia correta
        ClassPai testePai = new ClassFilha();  // <-- CORRETO
  
        //Instancia correta  
        ClassFilha testeFilha = new ClassFilha();  // <-- CORRETO

        // Instancia Incorreta
        ClassPai testePai = new ClassPai();  // <-- ERRADO 
    }  
} 

pois uma classe abstrata nao pode ela msma ser instancia diretamente e sim utilizando o comando super() dentro de um contrutor de uma classe filha, foi mais ou menos isso que estava explicando para o denisspitfire
[/quote]
Hummm… entao para “Chegarmos até a classe Pai” tem que ir pela classe filha…

e se instaciar dessa fora

   ClassPai testePai = new ClassPai();  // <-- ERRADO   

O que acontece? retorna algum erro?

sim o java gerar um erro de compilação com a msg: “ClassPai is abstract; cannot be instantiated”

[quote=caio.ribeiro.pereira]RodrigoM91 pegando o seu codigo como exemplo, oq estava querendo dizer sobre o q vc nao entendeu é a respeito da instancia e não do que uma classe pai ou filha pode acessar.

como exemplo o no seu codigo:

public class ClassTeste {  
  
    public static void main(String[] args) {  
        
        // Instancia correta
        ClassPai testePai = new ClassFilha();  // <-- CORRETO
  
        //Instancia correta  
        ClassFilha testeFilha = new ClassFilha();  // <-- CORRETO

        // Instancia Incorreta
        ClassPai testePai = new ClassPai();  // <-- ERRADO 
    }  
} 

pois uma classe abstrata nao pode ela msma ser instancia diretamente e sim utilizando o comando super() dentro de um contrutor de uma classe filha, foi mais ou menos isso que estava explicando para o denisspitfire

[/quote]

Ata então eu entendi errado mesmo :smiley:

Pensei que você está falando a respeito do que pode acessar ou não, perdão !

É realmente a sua colocação a respeito de instanciar está correto,

Nesse caso Vinicius o java nem compila essa linha de código, ou seja o problema já aparece logo na compilação !