Pegadinha no exame

ae galera, estudando as pegadinhas do exame, aproveitei e vou postar um codigo e a galera que está estudando diz se compila ou nao compila… e se nao compilar pq nao compila…


class Camilo{

	static  void nome(){}
	public static void main(String ar[]){

	}
}
class Neto extends Camilo{
	 void nome(){}
}

agora esse tb tinha la

class Camilo{

	 void nome(){}
	public static void main(String ar[]){

	}
}
class Neto extends Camilo{
	final void nome(){}
}

deixem a opniao de vocês depois colocar a minha para ver se estou no caminho certo :d
flw! rumo a scjp :smiley:

O primeiro código não compila, pois não podemos sobscrever métodos estáticos. O segundo compila sdem problemas…

T+

ambos não compilam.

[quote=diego2005]O primeiro código não compila, pois não podemos sobscrever métodos estáticos. O segundo compila sdem problemas…

T+[/quote]

certinho :wink:

pegadinha boa…

só pra frisar o assunto… no segundo exemplo, se fosse o inverso, ou seja, se o metodo nome() da classe Camilo fosse marcado com o modificador final, não compilaria… mas se fosse marcado como private, compilaria sem problemas, apenas não poderia ser subscrito. :wink:

HA! pegadinha do malandro! meu xuxu!

certeza? :roll:

pera ai galera houve um pouco de confusao, vamos la a questao… apesar de ser xuxu como falaram… mais tem muita dessa questao… no exame… infelizmente o “xuxu” deve ser estudado…
Marcio_Nogueira - a segunda compila q tem o final… a com o static q n compila.

a questao é que os metodos static nao sao subscrito e sim redefindos… e por isso que o primeiro nao compila. pq é o mesmo de eu isso em uma classe:

class Tes{
static void nome(){}
void nome(){}

isso nao compila apenas pq mudei o modificador de nivel de acesso da classe… so se eu mudasse o tipo… entao nao o primeiro nao compila.
O segundo compila pq nao problema de eu dizer que na subclasse meu metodo vai ser final ou seja nao vai poder ser subscrito uma subclasse da subclasse que é sub da super.

cuidado com essa expressao, pq private nem herdado é… pertence a classe… entao nao tem nada ver com subscrição private é com relacao a classe… olhe o codigo abaixo…

class Avi{
private void dados(){}
}
class Av extends Avi{
void dados(){}
}

compila normal e nao é uma subscrição do metodo…

bom pessoal eu pensei assim quando vi uma classe desse tipo se eu tiver errado, so corrigir… heh valeu :smiley:

rumo a scjp!

O primeiro não compila porque não se pode sobrepor um método estático com outro de instância.

O segundo compila (não há problemas em pôr um “final” neste caso). Só que você não pode fazer o seguinte:

class Bisneto extends Neto {
    void nome() {}
}

porque você estaria tentando sobrepôr um método que é marcado “final”.

cara… volta la e leia meu texto novamente… eu apenas disse que se marcar a classe pai como private, a classe filha pode escrever o metodo com a mesma assinatura que não dará erro de compilacao… eu nao disse que a classe filha herda, tampouco subscreve um metodo private, pelo contrário… eu disse que a classe filha NÃO SUBSCREVE

[quote=caduengenheiro][quote=LPJava]

cuidado com essa expressao, pq private nem herdado é… pertence a classe… entao nao tem nada ver com subscrição private é com relacao a classe… olhe o codigo abaixo…

class Avi{
private void dados(){}
}
class Av extends Avi{
void dados(){}
}

compila normal e nao é uma subscrição do metodo…
[/quote]

cara… volta la e leia meu texto novamente… eu apenas disse que se marcar a classe pai como private, a classe filha pode escrever o metodo com a mesma assinatura que não dará erro de compilacao… eu nao disse que a classe filha herda, tampouco subscreve um metodo private, pelo contrário… eu disse que a classe filha NÃO SUBSCREVE… [/quote]

assim se ela nao herda como é que vai subscrever? entao entendi errado… mais foi o que qdo li, o que vc falou que entendi… so nao precisa ficar nervoso por algo tao simples. :smiley:

[quote=LPJava][quote=caduengenheiro][quote=LPJava]

cuidado com essa expressao, pq private nem herdado é… pertence a classe… entao nao tem nada ver com subscrição private é com relacao a classe… olhe o codigo abaixo…

class Avi{
private void dados(){}
}
class Av extends Avi{
void dados(){}
}

compila normal e nao é uma subscrição do metodo…
[/quote]

cara… volta la e leia meu texto novamente… eu apenas disse que se marcar a classe pai como private, a classe filha pode escrever o metodo com a mesma assinatura que não dará erro de compilacao… eu nao disse que a classe filha herda, tampouco subscreve um metodo private, pelo contrário… eu disse que a classe filha NÃO SUBSCREVE… [/quote]

assim se ela nao herda como é que vai subscrever? entao entendi errado… mais foi o que qdo li, o que vc falou que entendi… so nao precisa ficar nervoso por algo tao simples. :smiley:
[/quote]

exatamente… vc entendeu errado … e não é a primeira vez… uma critica construtiva… não me leve a mal

Por que não? Não daria para acessar assim?

Neto n = new Neto();
n.nome(); // método de instância
Neto.nome(); // método da classe

Isso é uma particularidade do Java?

Por que não? Não daria para acessar assim?

Neto n = new Neto();
n.nome(); // método de instância
Neto.nome(); // método da classe

Isso é uma particularidade do Java?[/quote]

n.nome(); não é metodo de instancia… é uma maneira do java de te tapiar para pensar que é… metodo de instancia é quando nao tem modificador static.

Sei disso, mas essa é minha dúvida.
Em outras linguagens, você não consegue chamar um método estático com n.nome(), só Neto.nome().

A pergunta é se existe algum motivo especial para o código não compilar ou se é só decisão de projeto da linguagem.

[quote=Schuenemann]Sei disso, mas essa é minha dúvida.
Em outras linguagens, você não consegue chamar um método estático com n.nome(), só Neto.nome().

A pergunta é se existe algum motivo especial para o código não compilar ou se é só decisão de projeto da linguagem.[/quote]

sim sim… porém no java podemos chamar metodo/atributo/classe interna estatico dentro de uma variavel de instancia, como se pertencesse a instancia, como vc bem sabe … na minha opiniao isso não é legal porque prejudica a legibilidade, mas tudo bem… é uma boa pegadinha pra prova

qto a sua real pergunta entao, métodos de instancia subscritos tem como finalidade o polimorfismo … metodos estaticos são redefinidos… agora misturar estatico com instancia… seria redefinido ou subscrito?

creio eu que seja um dos motivos de gerar erro de compilacao… é a minha visao do problema… outras serão bem vindas…

ai galera, olha essa questao:

public class EnumHash {
enum estacao{
PRIM,VERA,OUT,INVER	}

public static void main(String[] args) {

Set<estacao> es = new HashSet<estacao>();
		es.add(estacao.OUT);
		es.add(estacao.PRIM);
	for(estacao c: es)
	System.out.println(c);

Como vcs acha que é a saida? hehe explica porque… essa ai entra as regras de conjunto e ter atenção que é um HashSet.

:smiley:

Supondo claro que você feche as chaves para o código compilar, a saída é
OUT
PRIM

ou

PRIM
OUT

Não dá para saber ao certo pois é um HashSet e a ordem não é garantida.

ops esqueci das chaves tirando isso a saida é :
PRIM
OUT

observe ele nao tem uma ordem de iteração mais, meu conjunto é classificado pq enum segue o contrato de equals e hashCode enum implementa o contrato de forma eficiente… entao ele ordena… agora se fosse uma List --ArrayList ele ia imprimir:
OUT
PRIM

ja que o acesso é por indice… e o conjunto nao foi ordenado…

eu tive essa conclusão com esse codigo… seria isso?

Acho que não, Camilo.

Adicione todos os elementos no set e daí imprima. Vc vai ver que a saída é:
PRIM
OUT
VERA
INVER

Sair ordenado com PRIM e OUT foi só coincidência.
Nem que os hashCodes fossem ordenados, ainda haveria a possibilidade de um HashMap não devolver os números ordenados.

Só de curiosidade os hashs são:

PRIM: 19770577
VERA: 28117098
OUT: 14978587
INVER: 25669322

um interessante entao a saida nao é garantida por se tratar de um hashSet que nao sabemos como ocorre a iteração?