Ponteiro em Java

Olá pessoal,

gostaria de implementar uma estrutura com ponteiro em Java:

struct exe {
         int numero;
         struct *exe teste1;
         struct *exe teste2;
}

+/- assim…
alguém tem idéia para implementar esse tipo de ponteiro.

Obrigado

AAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
MULEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEQUE …

Java nao trabalha explicitamente com ponteiros …

oque voce pode fazer é criar uma classe com esses atributos … e ao inves de ponteiros voce REFERENCIA uma classe ao seu objeto.

Ps. Scottys0 com arrepios lembrando de alocação de memoria em C++

Ah, saquei…

É lógico, que ridículo, valeu mesmo scottys0. Que burro eu sou.

É simples assim! :smiley:

PS: Desculpa ter te lembrado esses tempos difíceis. :lol:

[quote=rodrigo.achilles]Ah, saquei…

É lógico, que ridículo, valeu mesmo scottys0. Que burro eu sou.

É simples assim! :smiley:

PS: Desculpa ter te lembrado esses tempos difíceis. :lol: [/quote]

ahuuuuummmmmmm

Repita este mantra:

Java não é C++; Java não é C++; Java não é C++; Java não é C++;

ahuuuuummmmmmm

Eleve seu espírito, tire todas as impurezas de acesso direto a memória

ahuuuuummmmmmm

[quote=LuizAvila][quote=rodrigo.achilles]Ah, saquei…

É lógico, que ridículo, valeu mesmo scottys0. Que burro eu sou.

É simples assim! :smiley:

PS: Desculpa ter te lembrado esses tempos difíceis. :lol: [/quote]

ahuuuuummmmmmm

Repita este mantra:

Java não é C++; Java não é C++; Java não é C++; Java não é C++;

ahuuuuummmmmmm

Eleve seu espírito, tire todas as impurezas de acesso direto a memória

ahuuuuummmmmmm
[/quote]

A nao fala mau de C++ pq … tem muita coisa feito nele q funciona bem pra caramba …

O negocio é nao misturar as coisas …

uma das coisas que os caras amam fazer em provas de certificação java eh confundir o cara com C++, pelo menos é assim com SCJP … isso por que o objetivo do teste é ver se voce esta preparado para “as situações do mundo real” … então se o Eclipse/Netbeans/IntelliJ ou outra IDE tentar fazer voce digitar codigos em C++ … voce grita :

" EU RENUNCIO EM NOME DE JESUS … "

public class Exe {
    int numero;
    Exe teste1;
    Exe teste2;
}

Java tem ponteiro sim, só que aqui o nome é referencia. Vc só não tem acesso direto ao endereço de memória que ele representa, e por isso vc não pode manipular esse endereço.

A sun pode, através da class sun.misc.Unsafe.

Olá

Sérgio, sempre que vejo alguém dizer que Java tem ponteiro eu me lembro do tempo em que programava em Fortran. Naquela época a gente fazia na mão todo o endereçamento da memória. A gente alocava um array de uma dimensão com toda a memória livre da máquina e ficava movendo da memória para o disco e vice-versa. Fortran não tinha ponteiros mas a gente criava os ponteiros de endereçamento indireto e fazia aritmética com estes ponteiros.

Muitos anos depois inventaram o C e então pudemos usar os ponteiros com suporte dentro da linguagem. É óbvio que se a gente podia acessar uma determinada posição da memória então se podia acessar a tal posição acrescida de uma variável. Ou seja, a linguagem ter ponteiro significa que ela tem suporte a aritmética de ponteiro.

Para mim (e para todos os livros básicos que já li de Java), nossa linguagem favorita não tem suporte a ponteiros. O que a API faz lá dentro de modo nativo ou o fato de passar referências de forma alguma significa que Java tem ponteiros.

Não é a primeira vez aqui no GUJ que sou obrigado a me manifestar deste modo. Java não tem ponteiros e esta é uma das principais vantagens do Java.

Mas se você conseguir, me mostre um exemplo de uso de ponteiros em Java sem ser do modo que eu falei acima que fazia com Fortran. Mostre suporte da linguagem a aritmética com ponteiros.

[]s
Luca

[quote=Luca]Mas se você conseguir, me mostre um exemplo de uso de ponteiros em Java sem ser do modo que eu falei acima que fazia com Fortran. Mostre suporte da linguagem a aritmética com ponteiros.
[/quote]

Não dá para fazer aritimética com ponteiros, nem para perguntar qual é o endereço físico de um ponteiro em Java. Foi o que eu falei.

Estou usando a palavra ponteiro como sinônimo de referencia. Talvez isso não seja legal, pois o cara confunde com os ponteiros do C. Deve ser por isso que o nome em Java é referência.

Posso estar errado. Estou apenas levantando a bola para discussão, mas penso que em Java há ponteiros, só que eles são totalmente protegidos do programador. Não temos acesso a eles.

Mas eles estão lá. Existem! Tanto existem que existe uma classe sun.misc.Unsafe que te permite acessar o endereço físico de uma referencia em Java e fazer artimética com ela. Acredite se quiser. Mas só os pacotes do core da linguagem podem fazer uso dessa classe. Ela tem funções que te retornam o endereço físico de memória de um objeto, acredite se quiser!

[color=red]OBS: O “acredite se quiser” aqui refere-se aquela série famosa da televisão onde o apresentador mostrava casos e situações bizarras e no final terminava com a frase: “Acredite se quiser!”. Ou seja, é apenas para enfatizar que a coisa é estranha mesmo![/color]

Essa bagunca ai em baixo é ponteiro…

int *p;  
int **r;      
int ***z;
c = **z + p;

… não sei , mas não consigo abstrair o conceito de ponteiro em java … pois eu ainda não vi uma referencia que aponte para outra referencia e assim sucessivamente. Se existir … alguem fale .

:slight_smile:

Não sei se é a mesma coisa, mas Java tem lista encadeada não tem ??? (LinkedList).

public class Node {
    private Object value;
    private Node next;
}

Na verdade aí vc tem um objeto que aponta para outro que contém uma referencia para outro objeto do mesmo tipo, formando uma cadeia. Acho que não equivale ao que vc falou. :roll:

Olá

Fortran tem arrays e tem índices dos arrays. Então quando se compila o fonte a linguagem gera uma aritmética em cima dos endereços dos índices porque assembler não tem arrays, somente tem aritmética direto sobre as posições de memória.

Estou fazendo esta comparação com uma linguagem que existe há mais de 40 anos para você ver que o que a linguagem de alto nível tem lá dentro para converter para linguagem de máquina não é uma facilidade da linguagem disponível ao programador.

Eu não tenho a menor idéia sobre como Java acessa as coisas nativas do sistema operacional porque não estão disponíveis para mim. E igualmente sigo afirmando que Java não disponibiliza ponteiros para uso do programador.

<editado>Editei para falar ao contrário: linguagem de máquina não tem estruturas de dados como arrays ou outros tipos (classes, struts, etc.), tem somente ponteiros. É assim que a gente programa em assembler.</editado>

[]s
Luca

[quote=saoj]Não sei se é a mesma coisa, mas Java tem lista encadeada não tem ??? (LinkedList).

public class Node {
    private Object value;
    private Node next;
}

Na verdade aí vc tem um objeto que aponta para outro que contém uma referencia para outro objeto do mesmo tipo, formando uma cadeia. Acho que não equivale ao que vc falou. :roll:
[/quote]

Ai voce esta falando de estrutura de dados … em … c++

class Node {
       int valor;
       Node *next;
       ..  
};

estou falando de referencia pura … exemplo, uma variavel que contenha o endereco de outra sucessivamente ate acessar um valor na heap;

Sinistro !!! Acho que em Java não tem isso não, nem nas entranhas da VM, pois toda referencia aponta para um objeto, e todo objeto criado tem um header. Logo vc pode ter algo assim:

ponteiro -> header + ponteiro -> header + ponteiro, etc e tal…

ponteiro que aponta para outro ponteiro puro acho que não existe na especificação da VM mesmo…

Procurei ate cair cabelo … na especificação da linguagem e nao achei nada que falasse explicitamente de enderecamento e logica de acesso a heap… então …
http://java.sun.com/docs/books/jls/second_edition/html/jIX.fm.html

touche

[quote]Estou usando a palavra ponteiro como sinônimo de referencia. Talvez isso não seja legal, pois o cara confunde com os ponteiros do C. Deve ser por isso que o nome em Java é referência.
[/quote]

Eu jah tinha postado isso aqui:
http://www.guj.com.br/posts/list/19722.java

Mas para ficar BEM claro a separação das coisas entre C,C++ e Java:
método em java(passagem por referência a objeto):

public static void troca(int[] ref,int x,int y){
      	int temp;
      	temp=ref[x];
      	ref[x]=ref[y];
      	ref[y]=temp;
     	                                        }//troca feita em Java

chamada ao método:
troca(ref,x,x+1);

função em C(passagem por referência por ponteiros):

void troca(int *x, int *y){
 	int temp = *x;
 	*x = *y;
 	*y = temp;
                          }//troca feita em C 

chamada a função:
troca(&x,&y);

função em C++(passagem por referência):

void troca(int& x, int& y){
  int temp = x;
  x = y;
  y = temp;
                           }//troca feita em C++

chamada ao método:
troca(x,y);

int *x e int *y são os dois ponteiros que a função recebe como parâmetros.
O operador &(uppersign) é chamado de operador de endereços em C(que são passados aos ponteiros pela chamada da função).
Em C++,o operador & é o operador de referência(ele fica geralmente associado ao tipo da variável para se distinguir do operador de endereços de C) para as que forem passadas a função troca.
Ficou claro :?:

Dá uma olhada no código fonte do java.nio.DirectByteBuffer.

Tem acesso direto a memória, manipulação de ponteiros, etc.

Esse sun.misc.Unsafe foi feito pela Sun para a Sun. É para aqueles pouquíssimos casos críticos onde a VM precisa de acesso direto ao enderaçamento físico de memória RAM, como no java.nio.

Olá

Discordo, a JVM tem sempre que acessar a memória RAM e outras coisas lá no fundo. É ela que põe a mão na lama e faz isto de forma mais complexa que for necessário mas com intuito de facilitar a nossa vida.

Conforme já disse, a CPU não dispõe de instruções sofisticadas de estruturas de dados. Um array é mapeado na memória na raça do mesmo modo como eu fazia nos meus programas em Fortran. A JVM tem que fazer isto.

Deixe de ser teimoso, Sérgio. Quem já usou ponteiros em C ou já programou em assembler tem absoluta certeza de que Java não disponibiliza ponteiros ao programador em sua sintaxe.

[]s
Luca

Sergio, as classes dos pacotes sun.* sao detalhes de implementacao da JVM da Sun. Sendo assim, elas podem fazer o que quiserem, afinal, elas nao tem que se preocupar com a portabilidade ou mesmo com a especificacao da JVM - afinal, elas estao abaixo disso. Em hipotese alguma, repito, [size=24]EM HIPOTESE ALGUMA[/size] voce deveria usar estas classes no seu codigo, a menos que voce esteja trabalhando na equipe da JVM da Sun, ou queira quebrar a cara quando uma nova versao da JVM sair (e quebrar o seu codigo), ou tentar rodar usando as JVMs da HP, BEA, IBM ou outros. Fim de papo.

Mais info em http://java.sun.com/products/jdk/faq/faq-sun-packages.html :wink:

[quote=Luca]Deixe de ser teimoso, Sérgio. Quem já usou ponteiros em C ou já programou em assembler tem absoluta certeza de que Java não disponibiliza ponteiros ao programador em sua sintaxe.
[/quote]

:oops:

Mas eu nunca disse o contrário. Java não tem ponteiro na sintaxe, mas as referencias nada mais são que ponteiros (endereços de memória), tanto é que a Sun pode manipulá-los via sun.misc.Unsafe.

Acho que nós dois estamos certos, com vc um pouco mais certo. :slight_smile:

[color=blue]Errata:[/color]

Não é a VM, que como o Luca falou sempre terá acesso, mas sim a API Java, isto é, código Java e não código C da VM.

[color=blue]Corrigindo:[/color]

É para aqueles pouquíssimos casos críticos onde o código Java precisa de acesso direto ao enderaçamento físico de memória RAM

[color=#444444][/color]

[color=red][size=24]Não estou usando sun.misc.Unsafe, e não usarei sob hipótese nenhuma.[/size][/color] Não porque vc está falando, mas porque a Sun quando escreveu essa classe insegura conforme o nome já diz, TRAVOU O SEU USO PARA QUALQUER CLASSE QUE NÃO SEJA DO PACOTE JAVA.*. :smiley:

Se vc descompilar o código da classe sun.misc.Unsafe vai ver que ela checa via reflection qual é a classe que está chamando ela. Se for uma classe fora do pacote java.* vc recebe uma Exception. Única possibilidade para eu usá-la seria reescrevendo as APIs do Java e substituindo-as classes na minha Virtual Machine.

CV, a questão não é sobre o sun.misc.Unsafe, nem sobre se eu quero ou não manipular ponteiros, e sim sobre se java tem ponteiros ou não. É como se Tostines vende mais porque está sempre fresquinho ou se é fresquinho por que vende mais.