O começo você disse certo. A classe abstrata não pode ser instanciada.
Se você criar uma classe que estende à uma classe abstrata, terá que implementar todos os métodos abstratos que ela declarou (a não ser que sua nova classe também seja abstrata, o que é perfeitamente possível).
Você pode "chamar" os métodos quantas vezes quiser, se é que eu entendi isso certo :)
E a chamada a super() faz referência ao construtor da Superclasse. Os construtores sempre chamam a super(), mesmo se você não deixar isso explícito no seu código. Se você tiver 2 classes:
public class A{
}
publicclassBextendsA{}
Object é a superclasse de A, que por sua vez é a superclasse de B. Então se você fizer:
new B();
Será executado o construtor de Object, depois o construtor de A e depois o construtor de B. Fez sentido?
ErickRAR
Sei que ela só pode ser estendida, não instanciada.
Correto.
Desta forma, quando eu estender ela em outra classe não poderei chamar seus métodos mais de uma vez?
Porque na classe concreta eu posso instanciar o objeto várias vezes é isso?
Pode chamar os métodos normalmente. Não muda nada em relação a isso.
E outra coisa, pra que server a chamada "super()" ?
o super() é para chamar a instancia da classe acima.
Toda classe extende Object, então digamos que você tenha:
public class Funcionario {
public Funcionario(){
super();
}
Esse código cria um construtor vazio e chama a chama também o construtor de Object. Na verdade ele é bem inútil, ja que isso ja em implicito na classe(tanto o construtor vazio quanto a chamada do super()), não é necessário declarar.
É melhor utilizado caso você tenha construtores com parametros na classe Pai.
OBS: Caso tenha que chamar o super() no construtor, ele tem que sempre ser o primeiro a ser chamado.
Você não conseguirá compilar o código abaixo:
publicclassFuncionario{publicFuncionario(){System.out.println("Vá fazer alguma coisa!");super();}}
W
wellington_a
Entendi.
Agora uma pergunta.
Qual a sua utilização sendo que poderíamos criar os métodos dentro da própria classe concreta?