Estou para fazer a prova da certificação SCJP 5.0 e preciso de uma ajuda de vocês à respeito de interfaces e o modificador protected.
Porque é possível usar o modificador protected em métodos e variáveis de instância, mas não em classes? Não faria sentido criar uma classe que só pudesse ser usada por meio de herança fora do pacote?
Porque variáveis em interfaces são implicitamente públicas, estáticas e final (constantes)? Porque não é possível declarar variáveis comuns (sem ser final e estáticas)?
Outra questão que me deixa muito confuso em relação à interfaces: porque é possível herança múltipla entre interfaces, mas não em classes? Tudo bem, faz sentido isso em classes porque pode ter dois métodos em classes diferentes com o mesmo nome e na herança múltipla pode dar conflito. Mas e quanto à isso:
public interface A {
public void m1();
}
public interface B {
public void m1();
}
public interface C extends A,B{
}
Não dá erro de compilação!!! Porque depois isso tem que ser implementado em alguma classe e não fará diferença de qual interface é (é isso mesmo?)
Gostaria de uma explicação melhor, pois quero entender o porque é assim.
Provavelmente foi uma decisão de projeto da linguagem - você quer algo que é exatamente o contrário de “final” (quando aplicada a classes). Ou seja, uma classe que só pode ser herdada.
Outra decisão de projeto. Em C# você nem pode definir constantes em interfaces (não há “variáveis” em interfaces). Por algum estranho motivo, em Java é permitido criar essas constantes em interfaces; isso é melhor tratado com “enum” (que foi implantado depois, no Java 5).
Deve ter sido por razões de correria - conforme você deve saber, em Java houve algumas coisas que foram deixadas para depois, como a parte de “generics” - que deveria ter sido já implantada no Java 1.0 mas não o foi por falta de tempo.
Quando houve tempo suficiente, então foi gerado o tal “Monstro” dos Generics que é excessivamente complicado, tudo para não quebrar a compatibilidade com bilhões de linhas de código que já haviam sido escritas anteriormente.
Conforme você mesmo viu, é outra decisão de projeto. Em C# você pode escolher implementar explicitamente um determinado método de uma determinada interface, em vez de implementar um método que pertence a algumas das interfaces implementadas por essa classe.
Estou para fazer a prova da certificação SCJP 5.0 e preciso de uma ajuda de vocês à respeito de interfaces e o modificador protected.
Porque é possível usar o modificador protected em métodos e variáveis de instância, mas não em classes? Não faria sentido criar uma classe que só pudesse ser usada por meio de herança fora do pacote?
[/quote]
Algo errado ai. sim é possível usar protected em classes o que acontece é que quando vc nomeia o arquivo XPTO e a classe XPTO isso vincula a classe a ser publica. Se vc usar um nome diferente do arquivo ou da classe vc pode usar protected, default,qq coisa.
É uma regra em relação ao arquivo fonte e não ao modificador.
interfaces não conjuntos de assinaturas publicas. não “correm”. Portanto ter variáveis nelas seria tão inutil quanto ter métodos.
E todas as assinaturas são publicas. Isso é uma definição. (interfaces representam contratos, e contratos são sempre publicos. Em java não ha margem para corrupção).
Java deu um canja ao permitir colocar constantes nas interfaces. Isso é considerado um anti-pattern hoje em dia, mas a linguagem permite isso. A lógica é que todos os membros de uma interface são públicos, então variáveis tb. Todos os métodos são abstratos e todas o resto é final ( o contrário de abstrato). E tem que ser estático porque essa constante pertence à interface e não ao objeto que irá implementá-la.
Não ha herança entre interfaces. Portanto não estamos falando de herança multipla. Em java não ha isso.
O mecanismo de extensão de interfaces é apenas isso, extensão.
do ponto de vista teorico é assim: herança é uma relação É-UM. Esta relação é muito forte. Algo só poder ser UMa coisa só.
extensão é uma relação COMPORTA-SE COMO. Esta relação é bem mais flexivel.
então classes que herdam classes SÃO essa coisa. Por exemplo, Pessoa herda Humano. Pessoa é um Humano.
classes que implementam interfaces COMPORTAM-SE como essa coisa. Por exemplo, Humano implementa Bípede.
interfaces que extendem interfaces aumentam o comportamento dessa coisa : Por exemplo, VoadorBipede que extende Bipede e Voador ( tem asas e anda em duas “patas”)
São três conceitos diferentes e apenas o primeiro é herança.
Só pra matar a dúvida (se é q vc ainda não entendeu).
Apenas as superclasses não podem ter os modificadores de acesso protected e private. Isso ocorre pq se uma superclasse pudesse ser
private, por exemplo, ela não poderia ser herdada. Automaticamente o uso do final não faria sentido algum.
Uma dica.
Apenas as classes top-level só podem ter os tipos de acesso public ou default, já as classes internas podem possuir os mesmos modificadores que os métodos. ou seja classes internas podem ser: -public;
-protected;
-default;
-private;
-abstract;
-final;
-static.
-strictfp
Quando escrevemos uma classe top-level, se declararmos ela como public, o arquivo onde ela foi escrita deverá possuir o mesmo nome da classe, e só podemos ter uma classe public por arquivo. Se quisermos escrever mais uma classe, no mesmo arquivo, e esta classe não for uma classe interna, só nos resta o tipo de acesso default para esta classe.
No livro da Kathy Sierra tem um capítulo que fala só de classes internas, anonimas e internas locais de métodos.
Espero ter ajudado.
[quote=feliperoliveira]Uma dica.
Apenas as classes top-level só podem ter os tipos de acesso public ou default, já as classes internas podem possuir os mesmos modificadores que os métodos. ou seja classes internas podem ser: -public;
-protected;
-default;
-private;
-abstract;
-final;
-static.
-strictfp
Quando escrevemos uma classe top-level, se declararmos ela como public, o arquivo onde ela foi escrita deverá possuir o mesmo nome da classe, e só podemos ter uma classe public por arquivo. Se quisermos escrever mais uma classe, no mesmo arquivo, e esta classe não for uma classe interna, só nos resta o tipo de acesso default para esta classe.
No livro da Kathy Sierra tem um capítulo que fala só de classes internas, anonimas e internas locais de métodos.
Espero ter ajudado.[/quote]
Para não ficar confuso. Apenas os modificadores: public, protected, private e default são de acesso. Os demais, são modificadores para outras coisas, e poderão ser aplicados em qualquer classe:
-abstract: Indica que a classe é abstrata, isto é, possui métodos sem implementação. Nesse caso, instâncias da classe não podem ser criadas.
-final: Indica que a herança nessa classe é proibida;
-static: Somente para classes internas. Indica que a classe interna não está associada a classe pai, exceto pelo namespace.
-strictfp: Indica que a classe deve garantir que calculos de ponto flutuante sigam a regra de precisão do IEEE;