Regras de implementação de um método (livro da Kathy)?

Galera,
Estou c/ uma dúvida referente o livro da Kathy, segue:

No capítulo 2 está dizendo que para implementação de um método de uma interface qualquer, é necessário que sigamos as regras de sobrecarga, que resumindo, dizem:

-Métodos sobrecarregados devem alterar os parâmetros;
-Métodos sobrecarregados devem alterar o tipo de retorno;
-Métodos sobracarregados podem alterar o modificador de acesso(colocar qualquer um), etc.

Tenho a seguinte Interface e Classe:

interface Boo { void o(); }

class Foo implements Boo{ [b]protected[/b] void o(){ // ñ compila tem o [i]protected[/i] System.out.println("o"); } }

E se ñ coloco nenho modificador de acesso também ñ compila, só compila c/ o public.
E as regras de sobrecarga??
Alguém pode me ajudar??

Qualquer um não =p
você não pode reduzir a visibilidade de um método…

e você está implementando a interface, cujos métodos são implicitamente “public abstract”…

você não pode reduzir a visibilidade de um “public” para um protected!

Só pra lembrar:

[quote][list]Implícito

do Lat. implicitu

adj.,
    que está envolvido ou contido, mas não expresso claramente;
    não expresso em palavras, subentendido;
    tácito.[/list][/quote]

Deh,

Só que essa regra de ñ diminuir a visibilidade q. vc está falando ñ é de Sobrecarga e sim de Subscrição!!!

To começando a achar que isso fui uma errata do livro!?!?

Bom, se está assim mesmo no livro da khaty, é uma errata.

:shock:

Mas o que você está fazendo com aquela interface e o seu método
é Subscrição e não Sobrecarga!

Seria sobrecarga, se você mudasse os argumentos(e não necessariamente os modificares ou o tipo de retorno)…

ao invés de um “protected void o() { }” fazer um

“protected void o(String s){ }” na sua subclasse!

Sim,

Mas, então o livro da Kathy está errado mesmo…

Esse erro e muito perigoso ñ é!!!

isso ia funcionar se fosse uma class abstract com um metodo default… porem nao funciona para interface devido os metodos de uma interface ser implicitamente public entao vc nao pode converter de public para protected na subscrição. por isso nao compila… o que vc tem q ter em mente sobre interface:

  • mesmo que eu nao declare nenhum modificador os metodos sao public
  • quando declarar uma variavel mesmo que nao coloque final, static e public implicitamente isso ja acontece.
    exemplo:
interface Z{
void z();//implicitamente public
public void y();
int k=5;//implicitamente public static final
}
class Compila{
public void z(){}
public void y(){}
}
class NaoCompila{
void z(){} //tentando converter de public para default
public void y(); //invalido nao implementei o metodo
Z.k=4;//tentei alterar uma variavel final
}

espero ter ajudado! qualquer duvida so postar ae :smiley:

Só para confirmar,

Para implementação de métodos de uma interface qualquer devemos obedecer as regras de Subscrição e não de Sobracarga!!