Classe final

6 respostas
A

Tenho a seguinte questão:

como posso fazer uma classe final ser herdada.

Sei que uma classe final não pode ser herdada naturalmente, mas nas pesquisas que fiz descobri que poderia de alguma forma fazê-lo.

Também vi que poderia se usar o arquivo .class da classe final como um back-end para a nova classe.

Por mais estranha que seja a questão, ela pode ser solucionada pois meu professor o disse (ele só não disse como).

6 Respostas

T

Em tese, você não poderia herdar de uma classe “final”, mas você pode usar um truque sujo, que é o de compilar a classe que herda dessa classe final com uma versão anterior dessa classe, que funcionaria direitinho (pelo menos é o que suponho). Vou fazer um teste aqui e lhe retorno.

B

Mal, interpretei errada a dúvida.
Desculpe.

D

Usando composição.

T

Crie a seguinte classe em "TesteFinal.java"

class TesteFinal {
    private int id;
    private String nome;

    public int getId() { return id; }    
    public String getNome() { return nome; }    
    public TesteFinal (int pId, String pNome) {
        id = pId; nome = pNome;
    }
    public String toString() {
        return getClass().getName() + "= " + id + ", " + nome;
    }
}

Crie a seguinte classe em "ClasseFilha.java"

class ClasseFilha extends TesteFinal {
    private String endereco;
    
    public ClasseFilha (int pId, String pNome, String pEndereco) {
        super (pId, pNome);
        endereco = pEndereco;
    }
    public String toString() {
        return getClass().getName() + "= " + getId() + ", " + getNome() + ", " + endereco;
    }
    
    public static void main(String[] args) {
        ClasseFilha cf = new ClasseFilha (100, "Ronaldo Nazario", "Madrid");
        System.out.println (cf.toString());
    }
}

Compile "ClasseFilha.java" com o comando javac. Isso irá compilar indiretamente "TesteFinal.java". Rode essa classe, você irá ter:
C>java -cp . ClasseFilha
ClasseFilha= 100, Ronaldo Nazario, Madrid

Agora edite TesteFinal.java para que a classe fique "final":

final class TesteFinal {
...

Compile APENAS TesteFinal.java.

Agora tente rodar ClasseFilha.java. Para o JDK 1.3, 1.4 e 5.0 da Sun, tive o seguinte resultado:

C>\jdk1.5.0\bin\java -cp . ClasseFilha
Exception in thread "main" java.lang.VerifyError: Cannot inherit from final clas
s
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
4)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
A

Então como se isto com composição?

D

Com composição você perde um dos benefícios da utilização da herança, que é manter a hierarquia de tipos, ou seja, sua classe não seria subclasse da classe derivada, propriamente dita.

Exemplo:

public final UmaClasse {
  public void xxx() { ... }
  public int yyy() { ... }
}
public class ClasseComposicaoUmaClasse {
  private UmaClasse o = new UmaClasse();

  public void xxx() {
    o.xxx();
  }

  public int yyy() {
    return o.yyy();
  }

  public String www() {
    return "novo método";
  }
}
Criado 14 de junho de 2006
Ultima resposta 14 de jun. de 2006
Respostas 6
Participantes 4