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

jpjcjbr

creio q a opcao 5 seja a correta

F

uhmm…
e pq???

Maicolino

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.

doug

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?

gugaa_df

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

leandrokjava

só pode ser a 5.

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?

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:

anderson.bonavides

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 :?:

anderson.bonavides

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:

Javabuntu

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…

LPJava
  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!

mateusbrum

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:

anderson.bonavides

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:

mateusbrum

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!

adriano_si

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)

mateusbrum

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

victorwss

É 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.

Sami_Koivu

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.

anderson.bonavides

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:

adriano_si

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:

Sami_Koivu

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);
       
       
    }

}
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:

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…

anderson.bonavides

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
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?

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?

anderson.bonavides

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

Raff

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

Raff

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

Raff

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:

Raff

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

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?

Raff

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

anderson.bonavides

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!

antraceno

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:

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 ?
}

}

}
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!

Raff
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 !!!!!!! :)

anderson.bonavides

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.

Raff

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

Raff

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??
Raff

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:

Mauricio_Linhares

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));

}
}

Mauricio_Linhares

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