Pegadinha

69 respostas
F

ola galera sem testar alguem sabe essa resposta bem di cara :smiley:

interface A{ void x();}
 abstract class B{
  abstract void x();
}
class C extends B implements A{
   
   //insira aqui codigo aqui 
       
    
 
} 

1)final void x(){}
2)int void x(){}
3)private void x(){}
4)protected void x(){}
5)public void x(){}

para nao dar erro de compilacao qual melhor opcao,quyal metodo deve ser implementado??

69 Respostas

J

creio q a opcao 5 seja a correta

F

uhmm…
e pq???

M

Opção 5. Porque para sobrescrever um método o modificador de acesso não pode ser mais restritivo, mas pode ser mais abrangente, logo pode ser public opção 5.

D

Olá pessoal
A alternativa que responde a pergunta feita é a 5 (cinco)
Por definição da jpc o atributo ou método que não for especificado o acesso será considerado
público…

flwsss…
at+

F

isso ai!!alguem tem mais?

G

Os métodos na interface são implicitamente public, por isso a resposta só pode ser a 5.

L

só pode ser a 5.

A

Resposta: 5. Mas só resta saber se ele ta implementando o método da interface ou da classe.

Na minha opnião ta implementando o metodo da classe abstrata que a primeira classe concreta que herdar da classe abstrata tem que implementar o método.

Alguêm mais discorda ou concorda?

F

anderson.bonavides:
Resposta: 5. Mas só resta saber se ele ta implementando o método da interface ou da classe.

Na minha opnião ta implementando o metodo da classe abstrata que a primeira classe concreta que herdar da classe abstrata tem que implementar o método.

Alguêm mais discorda ou concorda?

cara eu ja penso que é da inteface pois se vc colocar
como protected void x (){} nao aceita me parece que o modificador de acesso da inteface por ser publico implicitamente pesa mais.
Mas realmente nao aposterei mais que 10 reais,fiquei na dúvida… :smiley:

A

Ainda continuo achando que é da classe Abstract.

:wink:

C

anderson.bonavides:
Resposta: 5. Mas só resta saber se ele ta implementando o método da interface ou da classe.

Na minha opnião ta implementando o metodo da classe abstrata que a primeira classe concreta que herdar da classe abstrata tem que implementar o método.

Alguêm mais discorda ou concorda?

Vejo da seguinte forma

Quando na Classe C extendemos B e implementamos A, estamos dizendo que deve existir a declaração do método “x”, ou seja a declaração do método “x” na Classe C resolve o extends e o implements.

Certo :?:

A

carlospia:
anderson.bonavides:
Resposta: 5. Mas só resta saber se ele ta implementando o método da interface ou da classe.

Na minha opnião ta implementando o metodo da classe abstrata que a primeira classe concreta que herdar da classe abstrata tem que implementar o método.

Alguêm mais discorda ou concorda?

Vejo da seguinte forma

Quando na Classe C extendemos B e implementamos A, estamos dizendo que deve existir a declaração do método “x”, ou seja a declaração do método “x” na Classe C resolve o extends e o implements.

Certo :?:

Certissimo. Mas a discurção levantada por mim não é essa. A discurção levantada por mim é saber se o método vem da interface ou da classe. Essa é a grande sacada. Mas não deixa dúvida que o problema está resolvido.

:wink:

J

thiago.filadelfo:
Olá pessoal

atributo ou método que não for especificado o acesso será considerado
público…

flwsss…
at+

Cara vc está precisando rever uns conceitos mais que básicos… me diz uma coisa: se minha classe tiver em outro pacote acessando um atributo PADRÃO (esté é o acesso quando não se especifica nada :!: ) ela vai conseguir :?: :?: :?:

anderson.bonavides :
Olá pessoal

Certissimo. Mas a discurção levantada por mim não é essa. A discurção levantada por mim é saber se o método vem da interface ou da classe. Essa é a grande sacada. Mas não deixa dúvida que o problema está resolvido.

flwsss…
at+

Cara minha opinião que é da classe abstrata, na ordem da declaração primeiro extends depois vem o implements…
mas se alguém puder esclarecer melhor a resposta certa desta dúvida…

L
  1. por causa da simples regra que quando o metodo é subscrito ele nao pode ser menos restritivo que o metodo da superclasse… e na o void x(); ele é public… :smiley: implicitamente na interface.

flw!

M

Creio eu que primeiro implement e depois extends!

Pois se tu tiver que implementar os métodos da classe abstrata, obrigatóriamente teria que ser DEFAULT e ai tu não iria implementar a interface pois não permitiria métodos mais restritos (método interface PUBLIC), ai com certeza NÃO COMPILARIA!

O correto realmente seria a opção 5, o método satisfaria o acesso de ambos ! :wink:

A

LPJava:
5) por causa da simples regra que quando o metodo é subscrito ele nao pode ser menos restritivo que o metodo da superclasse… e na o void x(); ele é public… :smiley: implicitamente na interface.

flw!

Já pensou pelo sentido de que a primeira classe concreta que herda de uma classe abstrata deve implementar seu método abstrato?

:wink:

M

Já pensou pelo sentido de que a primeira classe concreta que implementa uma interface deve implementar seu método abstrato?

Agora temos que consultar na específicação e ver quem tem prioridade, se a mesma existe.

Mas no caso relatado acima, com certeza a opção 5 é a única indicada, pois seria a satisfatória!

A

Essa realmente está fods de chegar num veredicto… Vejamos bem… você colocar o método public responde a questão… mas alguém tentou colocá-lo mais restritivo ?? o Compilador vai fazer a verificação do prioritário primeiro… o erro vai acusar se quem tem mais prioridade é a Abstract class ou a Interface… Não sei se vai colar, mas na teoria é pra dar certo…

Falows 8)

M

:frowning:
O compilador diz que são tipos imcompatíveis.

V

É o método público (opção 5). Na interface, todos os métodos são implicitamente públicos. Logo para ele ser implementado pela classe C ele tem que ser público.

Quanto a questão de se o método está implementando da interface ou se está sobrescrendo da classe abstrata, na verdade está ocorrendo as duas coisas ao memo tempo. Ele está sobrescrevendo da classe abstrata E implementando da interface.

S

Perfeito.

Acho que você quis dizer o oposto. Ele não pode ser mais restritivo do que o método da superclasse.

[]s,
Sami

D

Resposta 5

É da interface pois há interface obriga que o o metodo implementado seja público, a classe abstrata permite que o método continue como default.

A

DaviPiala:
Resposta 5

É da interface pois há interface obriga que o o metodo implementado seja público, a classe abstrata permite que o método continue como default.

Essa sim para mim foi uma boa resposta. Porem será que ta correto mesmo?

rs
:wink:

A

então se houvesse um método void x() na Classe abstrata e o mesmo método na Interface quando sobrescrevermos esse método, ele sobrescreverá os 2 ?? Realmente tem muita lógica, afinal como os 2 são obrigatórios, se fosse realmente pra satisfazer um primeiro e outro depois, teríamos que ter 2 métodos iguais… o que é impossível de acontecer… é a explicação mais lógica até agora sem sombra de dúvidas, mas alguém tem algum material (na Web mesmo) que possa nos garantir isso pra não restar mais dúvidas ??

Falows :wink:

S

O melhor exemplo que achei trata-se de um caso de implementar duas interfaces com métodos com assinaturas iguais. É um caso diferente, mas ao meu ver completamente comparável.

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#228059


It is permitted for a single method declaration in a class to implement methods of more than one superinterface. For example, in the code:

interface Fish { int getNumberOfScales(); } interface Piano { int getNumberOfScales(); } class Tuna implements Fish, Piano { // You can tune a piano, but can you tuna fish? int getNumberOfScales() { return 91; } }
the method getNumberOfScales in class Tuna has a name, signature, and return type that matches the method declared in interface Fish and also matches the method declared in interface Piano; it is considered to implement both.

F

Legal todo mundo esta afiadissimo!Acho interessante postar aqui esse tipo de assunto especialmente para aqueles que como eu estão preste a fazer a prova,assim podemos discutir,discutir, ate dominar o assunto.Entao sem compilar de cara o que mostrar abaixo??

tem essa pegadinha bacana tambem:assunto Serializacao
 import java.io.*;
class Dono implements Serializable{
  String nome;   
    Dono(String no){
       nome=no; 
    }
}
class Carro implements Serializable{
   String tipo;
    Dono d;
    Carro(String t,Dono x){
        d=x;
        tipo=t;
    }
    Dono getender(){
        return d;
    }
}
public class Main {
 public static void main(String[] args) throws IOException {
         Dono d=new Dono("fabio");
         Carro c=new Carro("Ferrari",d);
         Carro c2=null;
       ObjectOutputStream x=new ObjectOutputStream(new     FileOutputStream("se"));
       x.writeObject(c);
       ObjectInputStream x2=new ObjectInputStream(new FileInputStream("se"));
        try {
            c2=(Carro) x2.readObject();
        } catch (ClassNotFoundException ex) {
        }
       System.out.println(" tipo; "+c2.tipo+ " dono; "+d.nome);
       
       
    }

}
A

Na minha opnião vai dar erro de compilação ou será causado algum exceção em tempo de execução.

Primeiro vc serealiza em a instância de Carro c. O que será serealizado será Ferrari, e uma meta informação da classe, ou seja, o nome da classe d Dono. Depois vc disse que c2 receberá uma nova serealização e tenta ler nessa nova serealização.

Mas não tenho certeza quano se trata de Genéricos, serealização e Threads.
:roll:

F

anderson.bonavides:

:roll:

Esta é uma questao só mesmo sobre serializacao e muita aencao estamos aqui serializando 2 objectos
olha com atencao a linha 32.

F

anderson.bonavides:
Na minha opnião vai dar erro de compilação ou será causado algum exceção em tempo de execução.

Primeiro vc serealiza em a instância de Carro c. O que será serealizado será Ferrari, e uma meta informação da classe, ou seja, o nome da classe d Dono. Depois vc disse que c2 receberá uma nova serealização e tenta ler nessa nova serealização.

Mas não tenho certeza quano se trata de Genéricos, serealização e Threads.
:roll:

Cara c2 recebe uma deserializacao e nao uma serializacao cuidado…

A

Quando se trata de Serealização ainda sou infantil

:wink:

D

Ferrari e Fabio.

Cara prestei atenção na questão e não vi nada estranho nela.

F

DaviPiala:
Ferrari e Fabio.

Cara prestei atenção na questão e não vi nada estranho nela.

Justamente cara nao tinha nada de estranho era para saber logo o que imprime,so isso.

F

quem se arrisca? :slight_smile:

import java.util.*;

class Conver{
 //insira aqui
    
}
  


public class Main {
  Conver c=new Conver(){
     public void x(Integer ... x){
          System.out.println("Integer  ... x");
     }  
   };
  void y(){
   c.x(2,3);  
 }
        
 public static void main(String[] args) throws IOException {
  new Main().y();
}
}

Para imprimir qual metodo tenho que inserir na class Canver

  1. void x(Integer…x){ System.out.println(“Superclasse”);}
  2. static void x(Integer…x) { System.out.println(“Superclasse”);}
  3. static void x(int… x){ System.out.println(“Superclasse”);}
  4. protected final void x(Object … x){ System.out.println(“Superclasse”);}
  5. nenhuma delas
  6. qualquer uma delas
A

fabioEM:
quem se arrisca? :slight_smile:

Para imprimir qual metodo tenho que inserir na class Canver

  1. void x(Integer…x){ System.out.println("Superclasse);}
  2. static void x(Integer…x) { System.out.println("Superclasse);}
  3. static void x(int… x){ System.out.println("Superclasse);}
  4. protected final void x(Object … x){ System.out.println("Superclasse);}
  5. nenhuma delas
  6. qualquer uma delas

Tu copiou as saídas erradas. Pode levar em consideração que estão corretas?

F

anderson.bonavides:
fabioEM:
quem se arrisca? :slight_smile:

Para imprimir qual metodo tenho que inserir na class Canver

  1. void x(Integer…x){ System.out.println("Superclasse);}
  2. static void x(Integer…x) { System.out.println("Superclasse);}
  3. static void x(int… x){ System.out.println("Superclasse);}
  4. protected final void x(Object … x){ System.out.println("Superclasse);}
  5. nenhuma delas
  6. qualquer uma delas

Tu copiou as saídas erradas. Pode levar em consideração que estão corretas?

isso mesmo so as que estao corretas,quais para ti?

A

Fabio presta atenção nos System.out.println("Superclasse); ta faltando o ". É isso que to perguntando.

R

para mim somente a numero 1…
so que eu não entendi muito bem o que você queria quem imprimisse
!!!

R

na verdade pode tanto ser a numero 1 ou a numero 5 é isso !!!

F

anderson.bonavides:
Fabio presta atenção nos System.out.println("Superclasse); ta faltando o ". É isso que to perguntando.

cara com certeza desculpas agora coloquei “” que faltava

R

iai e a resposta fabioEM ???

F

Raff:
para mim somente a numero 1…
so que eu não entendi muito bem o que você queria quem imprimisse
!!!

Pior que a 1 nao pode pq vc nao vai conseguir chamar um metodo sobrecarregado para o proposito da questão.Se colocar 1) void x(Integer…x){ System.out.println("Superclasse);} no código
vai acontecr o seguinte:

Terás a sobrescricao do metodo portanto o compilador vai chamar o metodo da subclasse em questão

Conver c=new Conver(){

};

a 5 tambem nao esta certa
F

Raff:
iai e a resposta fabioEM ???

cara só a 3) e a 4) mesmo
o importante nesse código é lembrar as regras de sobrescricao e de sobrecarga lembra a sobrecarga faz com que a variavel de referencia chame o metodo ja a sobrescricao faz com que o objeto chame o metodo :lol:
valeu se alguem tivei mais :smiley:

R

não entendi por que a 1) está errada !!! ela está certa no meu ponto de vista

A

fabioEM:

cara só a 3) e a 4) mesmo
o importante nesse código é lembrar as regras de sobrescricao e de sobrecarga lembra a sobrecarga faz com que a variavel de referencia chame o metodo ja a sobrescricao faz com que o objeto chame o metodo :lol:
valeu se alguem tivei mais :D

fabioEM não entendi bulhufas da sua explicação. O meu chutometro ia acertar em cheio a de número 3. Essa qustão envolve classes internas anônimas então da uma força ai e da uma explicação melhor se possivel?

R

cara para mim a 1,3,4 estão certas!

A

Raff de fato a opção 1 está errada. Compilei e o resultado foi realmente 3 e 4.

F

:oops:

anderson.bonavides:
fabioEM:

cara só a 3) e a 4) mesmo
o importante nesse código é lembrar as regras de sobrescricao e de sobrecarga lembra a sobrecarga faz com que a variavel de referencia chame o metodo ja a sobrescricao faz com que o objeto chame o metodo :lol:
valeu se alguem tivei mais :D

fabioEM não entendi bulhufas da sua explicação. O meu chutometro ia acertar em cheio a de número 3. Essa qustão envolve classes internas anônimas então da uma força ai e da uma explicação melhor se possivel?

ok cara é o seguinte:

Qd vc cria uma classe anonima
to tipo

Conver c=new Conver(){   
     public void x(Integer ... x){   
          System.out.println("Integer  ... x");   
     }

È como se vc criasse uma sub classe chamada justamente de subclasse “anonima”

por exemplo o codigo equivalente seria:

class A{   

    protected final void x(int...o){
          System.out.println("Objewcti  ... x");   
        
    }
       
} 
class B extends A{
     public void x(Integer ... x){   
          System.out.println("Integer  ... x");   
     } 
    
}
  public class Main {   
  
  void y(){ 
     A a=new B(); 
   a.x(2,3);     
}   
           
public static void main(String[] args)  {   
  new Main().y();   
}   
}

como vc pode ver temos um exemplo de sobrecarga
fazendo A a=new B();
a.x(2,3); estou chamando o metodo da classe A pois trata-se de sobrecarga,na verdade esta pegadinha testa 2 coisas:
classe anonima e sobrecarga
se ainda nao fui claro pode falar,realmente para explicacoes sou pessimo!

A

fabioEM:
ola galera sem testar alguem sabe essa resposta bem di cara :smiley:

interface A{ void x();}
 abstract class B{
  abstract void x();
}
class C extends B implements A{
   
   //insira aqui codigo aqui 
       
    
 
} 

1)final void x(){}
2)int void x(){}
3)private void x(){}
4)protected void x(){}
5)public void x(){}

para nao dar erro de compilacao qual melhor opcao,quyal metodo deve ser implementado??

acho que é a opção 5 :slight_smile:

R

Caro amigo de um olhada nesse codigo e repare na regra da subcrição.....

public class Teste1{

void go (Integer... a){

System.out.println("Ola ");
}

//outra class
public class Teste2 extends Teste1{


public void go(Integer... a){

System.out.println("Iai cara");// quer dizer que isso não é uma subrscrição válida ?
}

}

}
F
Raff:
Caro amigo de um olhada nesse codigo e repare na regra da subcrição.....
public class Teste1{

void go (Integer... a){

System.out.println("Ola ");
}

//outra class
public class Teste2 extends Teste1{


public void go(Integer... a){

System.out.println("Iai cara");// quer dizer que isso não é uma subrscrição válida ?
}

}

}

Para quem é essa mensagem?não entendi?

F

antraceno:

acho que é a opção 5 :slight_smile:


isso cara!

R
fabioEM:
Raff:
Caro amigo de um olhada nesse codigo e repare na regra da subcrição.....
public class Teste1{

void go (Integer... a){

System.out.println("Ola ");
}

//outra class
public class Teste2 extends Teste1{


public void go(Integer... a){

System.out.println("Iai cara");// quer dizer que isso não é uma subrscrição válida ?
}

}

}

Para quem é essa mensagem?não entendi?

era para você fabião !!!!!!! :)

A

Raff ele não quiz dizer qual era a opção que compilava ele quiz dizer qual era a opção que imprimia superclasse. A opção 1 compila mas não imprime superclasse e sim Integer … x.

Fabio pq Object que é a opção 4 foi chamado primeiro que Integer até onde eu sabia e pensava q estava correto é que Object vinha depois de Integer e depois de Number.

R

agora eu entendi valew anderson !

F
ok  Number vem antes de Object em termo de preferencia ,mas aqui trata-se de chamada por referencia

Conver c=new Conver2(){

};

è como no exemplo  que te fiz

"c" é uma variavel de referencia para superclasse como para subclasse

lembra do exemplo que te fiz
class Conver{     
  
    protected final void x(int...o){   //tenta mudar para String vai dar erro
          System.out.println("Object ... x");     
           
    }   
         
}   
class Conver2 extends A{   
     public void x(Double ... x){     
          System.out.println("Integer  ... x");     
     }   
       
}   
  public class Main {    
     Conver a=new Conver2(){ //OBSERVACAO
         
     };
   void y(){   
 
   a.x(2,3);       
  }     
             
public static void main(String[] args)  {     
  new Main().y();     
}     
}

OBSEVACAO: chamada é por referencia vai chamar o metodo que esta em Conver ou seja na superclasse!!tenta mudar o paramentro do metodo da super classe para String vai dar erro!
espero ter te ajudado na compressao

M

Resposta: 5 pois os métodos de Interface são implicitamente public

Agora… Qual foi sobrescrito?? Eu acho que foi o da classe abstract. :shock:
Imagino a seguinte ordem:

1- A classe abstract implementou o método da interface como abstract;

2- A classe concreta deve implementar todos os métodos abstract da classe abstract;

3- Dessa forma, implementou o método da classe abstract;

4- Mas opa, a classe tb estende uma interface  :shock:

5- Não tem problema, o compilador viu que o método abstract que vc implementou, atende as exigências também da interface   <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pngmiley.png?v=5" title=":smiley:" class="emoji" alt=":smiley:"> assim voce não precisa reimplementar (ou seja, ganhou a classe abstract)

Essa é minha opinião
Abraço!

F

Essa é de um meu amigo,bem facinha quem tenta?nao vale compilar:

class A{
    int x=0;
    A(){
      this.x();  
    }
    void x(){
        System.out.println("x");
    }
    
}
  
public class Main {
    
    public static void main(String[] args) {
     new A().x();
    }
    
}

1)nao compila
2)imprime x
3)imprime x x
4) imprime x x x

R

imprimi X isso ?

F

Nao cara X e depois X novamente eh eh :-o

F
tambem tinha errado essa estupida questao!!Mas é falta de atencao mesmo

repara so aqui

new A().x();

faz 2 coisas cria um objeto A,mas lembra-se que no construtor tem uma chamada ao metodo x()
A(){

this.x();

}

e depois  chama no object new A().x() novamente o mesmo metodo é chamado ,nao é pegadinha nojenta??
R

puts verdade cara :slight_smile: falta de atenção mesmo !

F

essa é simpatica que quer tentar ?sem compilar ,de cara qual a resposta?

import java.util.*;


public class Main {  
    
  static void add(List u){
     System.out.println("com mais prioridade e \' "+u.peek());
  }  
    
   public static void main(String[] args) {   
       Queue y=new LinkedList();
       y.offer(2);
       y.offer(12);
       y.offer(18);
       add(y);
     
}   
}

1)nao compila
2)18
3)2
4)nao compila pela construcão do objeto polimorfica
5)o metodo offer nao existe
6)jogo a toalha :smiley:

F

sei que é final de semana galera !vamos la!quem se arrisca? :smiley:

M

Não compila, a interface Queue não implementa a interface List.

F

Matou!rapidez

F

e essa aqui qual é o resultado de y?

public class Main {
         public static void main(String[] args) throws Exception {
          for(Long y=0L; y< 1; ++y)
                while( y++ < 5){
                    System.out.printf("%s\n",y);
                } 
         System.out.printf("%s\n",y);
         }  
  }

?? :roll:

F

e essa aqui sobre enums quem tenta?

enum Pegadinha{A,B,C{},D{ String x(int x){super.x(3);return " int ";} };
String x(int x){
    out.println("Ah int");
  return "AH!!!!pegadinha do malandro!!";
}
String x(Integer x){
    out.println("Ah Integer");
  return "AH!!!!pegadinha do malandro!!";
}

}
public class T {
    public static void main(String[] args){
    
     out.println(Pegadinha.D.x(9));
     
   }
}

1)erro de compilacao
2)AH!!!pegadinha do malandro!!;
3)Ah int
4)Ah Integer
int
5)Ah int
int

}

public class T {

public static void main(String[] args){
out.println(Pegadinha.D.x(9));

}
}

M

1, errod e compilação, não tem static import pra out.

F

Perfeito!!e se tivesse??qual seria o resultado fera? :wink:

Criado 19 de janeiro de 2008
Ultima resposta 30 de jan. de 2008
Respostas 69
Participantes 19