Isso mesmo pessoal me bateu essa duvida de Orientação a Objetos e eu gostaria de saber a opniao de voces.
Porque interfaces não podem ter metodos estaticos e nem construtores?
thanks a lot.
Isso mesmo pessoal me bateu essa duvida de Orientação a Objetos e eu gostaria de saber a opniao de voces.
Porque interfaces não podem ter metodos estaticos e nem construtores?
thanks a lot.
Cara, tem um post desse aki no guj.
Mas basicamente é pq todos os métodos de uma interface sao abstratos e metodos abstratos nao podem ser staticos.
[quote=gp7junior]
Isso mesmo pessoal me bateu essa duvida de Orientação a Objetos e eu gostaria de saber a opniao de voces.
Porque interfaces não podem ter metodos estaticos e nem construtores?
thanks a lot.[/quote]
Por que interfaces nao é uma class… quando vc tem metodo estaticos ela pertence aquela class e interfaces != class. e pq os contrutores pertencem tb a class me diz se existe class statica? nao existe class estatica e sim classes aninhadas static.
Essa é uma questão interessante.
Alguns autores concordam que seria legal se você pudesse especificar uma assinatura de um construtor na interface, que os implementadores seriam obrigados a implementar. Na verdade, existe até alguns frameworks, como o Spring, que fazem essa exigência implicitamente (já que não tem um mecanismo para isso).
Porque isso não está presente em Java? Nunca li algum artigo sobre justificativa deles do porque. Mas acho que quiseram restringir a interface para um contrato comportamental, não tanto relacionado a construção do objeto.
Quanto aos métodos estáticos, não vejo sentido para isso, uma vez que como esses métodos são específicos da classe, não podem ser herdados e não possuem o benefício do polimorfismo, não haveria grandes benefícios de te-los presentes na interface.
Métodos implementados recairiam num problema ainda maior, pois a interface seria o local perfeito para um anti-pattern… o de uma classe com um vários métodos estáticos.
[quote=ViniGodoy]Essa é uma questão interessante.
Alguns autores concordam que seria legal se você pudesse especificar uma assinatura de um construtor na interface, que os implementadores seriam obrigados a implementar. Na verdade, existe até alguns frameworks, como o Spring, que fazem essa exigência implicitamente (já que não tem um mecanismo para isso).
Porque isso não está presente em Java? Nunca li algum artigo sobre justificativa deles do porque. Mas acho que quiseram restringir a interface para um contrato comportamental, não tanto relacionado a construção do objeto.
Quanto aos métodos estáticos, não vejo sentido para isso, uma vez que como esses métodos são específicos da classe, não podem ser herdados e não possuem o benefício do polimorfismo, não haveria grandes benefícios de te-los presentes na interface.
Métodos implementados recairiam num problema ainda maior, pois a interface seria o local perfeito para um anti-pattern… o de uma classe com um vários métodos estáticos.[/quote]
Muito legal sua colocação, apesar de um tanto complexa para quem está iniciando na Programação Orientada a Objetos.
Faço faculdade de Sistemas de Informação e o meu professor de POO II colocou essa questao em um de nossos exercicios, e certamente será uma questao de prova.
Mas de todas as respostas da minha turma nenhuma chegou a me convercer, diziam: … é um por um motivo tao obvio que o bom senso me impede de responder essa questao.
Mas vou dar uma pesquisada melhor e qualquer resposta mais convincente eu posto aqui.
Muito obrigado pela sua ajuda.
Uma séria candidata a resposta segue abaixo:
Java também oferece outra estrutura, denominada interface, com sintaxe similar à de classes mas contendo apenas a especificação da funcionalidade que uma classe deve conter, sem determinar como essa funcionalidade deve ser implementada. Uma interface Java é uma classe abstrata para a qual todos os métodos são implicitamente abstract e public, e todos os atributos são implicitamente static e final. Em outros termos, uma interface Java implementa uma ?classe abstrata pura?.
A sintaxe para a declaração de uma interface é similar àquela para a definição de classes, porém seu corpo define apenas assinaturas de métodos e constantes. Por exemplo, para definir uma interface Interface1 que declara um método met1 sem argumentos e sem valor de retorno, a sintaxe é:
interface Interface1 {
void met1();
}
A diferença entre uma classe abstrata e uma interface Java é que a interface obrigatoriamente não tem um ?corpo? associado. Para que uma classe seja abstrata basta que ela seja assim declarada, mas a classe pode incluir atributos de objetos e definição de métodos, públicos ou não. Na interface, apenas métodos públicos podem ser declarados ? mas não definidos. Da mesma forma, não é possível definir atributos ? apenas constantes públicas.
Enquanto uma classe abstrata é ?estendida? (palavra chave extends) por classes derivadas, uma interface Java é ?implementada? (palavra chave implements) por outras classes.
Uma interface estabelece uma espécie de contrato que é obedecido por uma classe. Quando uma classe implementa uma interface, garante-se que todas as funcionalidades especificadas pela interface serão oferecidas pela classe.
Outro uso de interfaces Java é para a definição de constantes que devem ser compartilhadas por diversas classes. Neste caso, a recomendação é implementar interfaces sem métodos, pois as classes que implementarem tais interfaces não precisam tipicamente redefinir nenhum método:
interface Coins {
int
PENNY = 1,
NICKEL = 5,
DIME = 10,
QUARTER = 25,
DOLAR = 100;
}
class SodaMachine implements Coins {
int price = 3*QUARTER;
// ...
}
Espero que ajude a esclarecer muita coisa.
obrigado a todos.
Eu não conheço o seu professor, não sei se ele gosta ou não de respostas longas, que praticamente re-expliquem a matéria dele… Mas se eu fosse ele, aceitaria uma resposta que falasse isso:
Por definição, a interface é um contrato, um compromisso comportamental que um determinado objeto deve ter. Por isso costuma-se a dizer que mais importante que os métodos da interface é a sua documentação.
Atribuir um construtor a uma interface não faz sentido pois equivale a colocar no contrato definições de criação, um aspecto não comportamental, e extremamente dependente da entidade sendo criada.
Menos razão ainda há para a criação de métodos estáticos, uma vez que eles não representam o comportamento de objeto nenhum, mas da classe como um todo.
[quote=ViniGodoy]Eu não conheço o seu professor, não sei se ele gosta ou não de respostas longas, que praticamente re-expliquem a matéria dele… Mas se eu fosse ele, aceitaria uma resposta que falasse isso:
Por definição, a interface é um contrato, um compromisso comportamental que um determinado objeto deve ter. Por isso costuma-se a dizer que mais importante que os métodos da interface é a sua documentação.
Atribuir um construtor a uma interface não faz sentido pois equivale a colocar no contrato definições de criação, um aspecto não comportamental, e extremamente dependente da entidade sendo criada.
Menos razão ainda há para a criação de métodos estáticos, uma vez que eles não representam o comportamento de objeto nenhum, mas da classe como um todo. [/quote]
sim, sua resposta está mais objetiva do que a minha.
obrigado mais uma vez.
Sim, está mais “compacto”.
Mas tem muito professor que gosta de respostas prolixas…
[quote=ViniGodoy]Sim, está mais “compacto”.
Mas tem muito professor que gosta de respostas prolixas…[/quote]
Rapaz, esse meu professor é muito estranho, ninguem entende, ele é famoso lá na faculdade por colocar em suas provas questoes sem respostas prontas.
No exercicio passado tinha uma que perguntava: O que acontesseria se colocasse a palavra chave abstract antes do nome do construtor de uma classe.
voce tem a resposta para mais essa?
São interessantes perguntas assim, mas não para provas!
Se fosse em java puro, certamente seria um erro de compilação. Agora, se ele estiver supondo a possibilidade de termos construtores abstratos…
Acho que seria mais ou menos a mesma razão para não ter construtores em interfaces.
Viny,
Eu li, entendi, mas não vi consegui imaginar uma aplicação prática para o uso de interface.
Você teria um exemplo para me explicar, de uma situação que usar uma interface seria “excencial”, ou pelo menos uma “boa prática”?
Obrigado.
fsquadro, para serialização de objetos vc tem que implementar uma interface chamada Serializable – isso é essencial – assim como para alguns métodos de ordenamento vc tem que implementar no objeto que será comparado a interface Comparable.
bom a respeito da interface Serializable ela serve para gravar o estado de um objeto… mas vou dar um exemplo com ela… pois eh meio complexo quando está bem no inicio da linguaguem.
Vamos dizer que vc tem a uma class Animal e tem outra duas classes que estende a classs animalZebra e Galinha. E tem uma interface chamada Pena.
Se ligue no codigo seguinte:
interface Pena{
void cor();
}
class Animal{}
class Zebra extends Animal{}
class Galinha extends Animal implements Pena{
public void cor(){System.out.println("Azul");
}
TRaduzindo…
Zebra É-UM Animal e Galinha É-UM Animal também blz?POREM, apenas os animais que tiver pena vai implementar a interface Pena para saber a sua cor. Então ai a essencia da interface, tudo que extends da class Animal, É-UM animal, mas nem tudo é um animal com pena se tiver uma com ave posso dar ele uma cor para suas penas.
Bom é isso ai um uso bem basico de interface… se nao ficou claro… a explicacao vai desculpando heheh !!
flw!! 8)
O uso de interfaces só fica mais claro mesmo com o tempo, quando você precisar separar o seu programa em módulos pouco dependentes entre si, ou quando você precisar programar frameworks para outros programadores usarem.
dá erro de compilaçao? (ele foi até sucinto nessa pergunta)