Pegadinha - Controle de Fluxo

Tavo fazendo alguns simludados e cai o seguinte:

public class Varg_Args {
    
    public Varg_Args(String[]...array) { //1)
          System.out.println("Varg_Args String[]...array " +array[0]);
    }
    public Varg_Args(String...array) { //2)
          System.out.println("Varg_Args String...array " +array[0]);
    }
     public Varg_Args(String[] array) {//3)
         System.out.println("Varg_Args String...array " +array[0]);
    }
      public static void main(String...a){
         new Varg_Args(new String[]{"ola 1"});
         new Varg_Args("ola 2");
      }
}

qual linha deve ser removida para compilacao e execucao do codigo??

na minha opniao a 3… pois ela e a 2 tem a mesma funcionalidade

a 1 nao!!

[quote=LPJava]na minha opniao a 3… pois ela e a 2 tem a mesma funcionalidade

a 1 nao!![/quote]
Na mosca!! :slight_smile: eu tinha me espantado ao ver esse tipo de varg args,nunca tinha visto assim!!

Para mim a 1 e a 3 tanto faz remover.

pois é cara eu tambem achavo mas o problema que
String…a é diferente di String[]…a,acho que essa ultima seria como um vetor de vetores!ou seja cada posicao da a[0] vai referenciar outro vetor de strings,nao tenho certeza to tentando ir pela lógica :roll:
mas como o LPJava falou a 2 e a 3 sao iguais.
Agora tenho uma duvida alguem sabe pq isso aqui embaixo esta certo!?[code]
public class Arrays {

/** Creates a new instance of Arrays */
public Arrays() {
}
    public static void main(String...a){   
       int array[]={2,3,4,5,6,7};
       Object ob=new int[]{30,40,50,60,70,80,90};

//aqui estou criando o que???e pq nao da certo se fizer
//Object ob[]=new int[2];
//pois posso usar o polimorfismo assim
// Object ob=new Integer[2];
array=(int[]) ob;
System.out.println(array[0]);
}

}
[/code]

:shock:

pergunta dificil legal :slight_smile:

[quote=fabioEM][quote=LPJava]na minha opniao a 3… pois ela e a 2 tem a mesma funcionalidade

a 1 nao!![/quote]
Na mosca!! :slight_smile: eu tinha me espantado ao ver esse tipo de varg args,nunca tinha visto assim!![/quote]

eu tb… vi algumas perguntas dela no whizlabs e fui estudar… esse assunto está entre linhas do capitulo 3 do livro da kathy quando ela explica vargs!

vai imprimir 30… array=(int[]) ob; pois o array ob é atribuido ao array de int , sendo que um cast é feito antes disso… =)… opa nem li…

Foi mau corrigindo não li direito… o enunciado…

por exemplo:

    int y = 2;
String[] x = new String[2];
    x[0]=y; // isso não pode vc esta tentando adicionar um int num array de strings...

     Integer[] x = (Integer)new String[2]; // isso também não pode... vc esta fazendo o cast no array, mas e em seus membros?   

     Object ob = new int[2];  isso pode por que todo array é um Object
     Object[] ob = new int[2];  isso não pode um array de object não pode receber um array de ints
     Object[] ob = new Integer[3]; mas isto pode.. pois Integer é um Object passa no tes é um
            

            Integer vv = 4;
	if(vv instanceof Object){
		System.out.println("Integer passar no teste é um Object);
	}

Pois é fujioka mas o que aconteceu entao aqui embaixo?Eu criei um objeto?
ou uma variavel de referencia para ele?
Object ob = new int[2];
pois nao posso ver o conteudo,ou seja
System.out.println(ob[0]);!da erro de compilacao,como vc só sei que nao posso fazer isso, mas o pq? que nao posso visualizar:cry:
Realmente a dúvida esta mais se foi criado um object ou o que! :?

E olha so essa galera ,e coisa louca!! :shock:

Object ob=new int[10];
System.out.println(ob instanceof int[]);//beleza imprime true,apesar de nao saber que podia usar tipos primitivos como sendo vetores no instanceof!Fiquei sabendo agora as 12;41! :smiley:
então se a variável ob é uma instância do vetor int[] eu não deveria poder manipular-la?? :?Ou simplismente só deixei o compilador mais confuso que eu!!! :stuck_out_tongue:

bom fabio vc confuiu… vc ai nao tem tipos primitivos vc tem um array que aceita elementos do tipo primitivo. Mas lembra que no fundo no fundo array sao sempre objetos? entao por isso que é valido o uso de instanceof para array… é comum sempre confudir o tipo dos elementos do array com a questao de tipos primitivos.

espero ter ajudado! capitulo 2 do livro da kathy se nao estou equivocado…

[quote=LPJava]bom fabio vc confuiu… vc ai nao tem tipos primitivos vc tem um array que aceita elementos do tipo primitivo. Mas lembra que no fundo no fundo array sao sempre objetos? entao por isso que é valido o uso de instanceof para array… é comum sempre confudir o tipo dos elementos do array com a questao de tipos primitivos.

espero ter ajudado! capitulo 2 do livro da kathy se nao estou equivocado…[/quote]

beleza cara isso eu sei , mas pq nao posso manipular??o objeto??
afinal ele passa no teste
ob=new int[20]; passa no texte (ob instanceof int[]) ,logo nao poderia
visualizar o conteudo ob[0] e pq nao posso fazer ob[]=new int[20]??
Essa é minha duvida maior cara! :roll:

fabio vc está confudido as coisas como é q se criar um array normal? observe o seu codigo e veja o q está acontecendo…analise ele e veja exatamente o que acontece…
Lembre-se da regra também que toda class extends a Object em java… lembra dessa regra? todas… mais quero q vc analise o seu codigo com um codigo de array normal e veja qual a diferença entre ele e pq com o array normal vc consegue acessar o elemento e no seu exemplo vc nao consegue… assim eu poderia ti dar a resposta… mais . ti fiz essa pergunta para que entenda… e quando se deparar com qualquer outro tipo de questao venha saber o por que… e nao ficar limitado apenas ao recurso de array… tentar visualizar alem do obvio…

Ok, vamos então com a nossa velha revisão:
int array []=new int[20];criei um objeto array que referência um objeto vetor que tera espaço do tipo int para alocar ate 20-1 int;
Quando eu faço Object y=new int[20]; sei que aqui não estou criando um vetor do tipo Object mas uma referência para um vetor de tamanho 20 que fica no heap ,portanto ,de acordo acordo com esse raciocínio, só tenho uma referência para este objeto int mas se eu consegui criar uma referência de um objecto para um objeto int de vetor mas detalhe sabemos que nao se pode fazer
[/code]
int y=0;
(y instanceof Object)

[code]
mesmo pq que todas as classe extendam Justamente Object
ainda nao entendi porque não posso fazer Object og[]=new int[20]?
afinal cosegui ter uma referência para um vetor do tipo int!
valeu LPJava mas ainda não entendi cara…

Vc está declarando uma variável de referência do tipo Object ob, criando um array de int de tamanho 2 e fazendo com que a referência ob “aponte” para o array criado. Importante lembrar que todo array independente do tipo (inclusive os de primitivos) é um objeto.

ob é uma referência Object que pode “apontar” para objetos de qualquer classe, nem por isso ele tem todas as “funcionalidades” de todos os tipos de objetos, só as suas. Object não é um array, mas um array com certeza é um Object, pq array é um objeto e todo objeto excetuando-se Object é subclasse de Object.

[quote=FabioEM]E olha so essa galera ,e coisa louca!! :shock:

Object ob=new int[10];
System.out.println(ob instanceof int[]);//beleza imprime true,apesar de nao saber que podia usar tipos primitivos como sendo vetores no instanceof!Fiquei sabendo agora as 12;41! :smiley:
então se a variável ob é uma instância do vetor int[] eu não deveria poder manipular-la?? :? Ou simplismente só deixei o compilador mais confuso que eu!!! :stuck_out_tongue: [/quote]

A variável ob não é uma instância do vetor int[] ela “aponta” para um objeto do tipo [] int. A variável ob é do tipo Object e não tem as “funcionalidades” de um array de inteiros, mas o array por ser um Object tem todas as “funcionalidades” de Object, por exemplo: métodos wait(), notify(), equals(), hashCode(), …

Pq são tipos incompatíveis, int é um tipo primitivo não é um objeto. Não tem lógica verificar se um array int passa no teste é um para um array Object, apenas para Object. Experimente usar um array de Integer, verás que funciona. Um Integer é um Object.

Entao se pelo que entendi ao fazer

  Integer y=0;
 if(y instanceof Integer){}

Neste nao estou dizendo: confira se y é uma instância da classe Integer,mas estou dizendo :confira se y é um tipo de Integer?Mas nao é a mesma coisa?
pq achavo que instanceof significa instância
mas valeu o resto sua explicação entendi :smiley:

A palavra instanceof traduzindo ao pé da letra seria algo como “instância de”, o significado aqui é "Verifique se y “aponta” para um objeto que passa no teste é um para a classe Integer."
Se fosse uma coisa desse tipo:

vc poderia fazer a tradução ao pé da letra: “Verifique se esse objeto é uma instância de Integer”.

Lembrando que instanceof só funciona para variáveis ou objetos que estejam na mesma hierarquia da classe a ser testada.