Afinal, java tem ponteiro?

Ouvi dizer que a sun tinha um “pacote” que permitia fazer umas coisas divertidas no estilo “ponteiro do C” em java, mas que só funcionava com as classes da sun, procede?

Liberdade poética?

[quote=Luca]Olá

Sérgio,

Ainda me deve o exemplo de pointers com Java. Vá lá naquele link que você me passou das linguagens que tem pointers, copie um exemplo qualquer e converta para Java.

[]s
Luca[/quote]

Naquele link que fala das linguagens que tem pointer, duas coisas me chamaram a atenção:

  1. No tópico “Suporte em linguagens de programação” o Java não é citado

  2. No mesmo tópico, C# é citado mas o autor fala “Em C#, ponteiros são suportados somente com algumas condições: qualquer bloco de código que inclua ponteiros deve ser marcado com a palavra-chave unsafe.”
    Mas, como C# usa o mesmo conceito de referência de Java, de acordo com as afirmações do Sérgio, não é só neste caso especial citado que se pode usar ponteiros em C#, e sim todas as vezes que se usa referência…ou seja…nem o artigo que o Sérgio usou pra argumentar concorda com a opinião dele…
    Em todo santo livro de Java vem escrito no começo que uma vantagem do Java é que ele não tem ponteiro…

Eu acho que a resposta do Vini foi perfeita! E pra mim ela encerra esse assunto…

Sobre ponteiros uma boa dica é esse artigo no Wikipedia

Pointer

Em nenhum momento o autor citou Java

axei legal o papo ai sobre os ponteiros…
ja cansei de ouvir q java n tem ponteiros mas tem um detalhe:

ha uma variavel e ha um objeto
variavel = new objeto
existe algo q faz com q akela variavel seja “ligada” aquele objeto… pode não ser um ponteiro igual ao do C, mas existe algo ali que diz “quando vc utilizar essa variavel ela estara referenciando / apontando para determinado objeto”…

entaum como eu disse, pode nao ser um ponteiro mas ha algo que faz essa ponte… =]

E esse algo se chama comumente de referência.

Que eles tem problemas com nomes é lugar comum, é só olhar pra Date, que não é uma data, mas isso não vem ao caso.

Nops, não é pra fazer coisas como ponteiros em C, é pra ter mais controle sobre o coletor de lixo, é o pacote java.lang.ref.

Tenho uma professora que diz: “em java , tuuuuuuuuuuuuuuuuudo é ponteiro”

ahuahuah

Sergio, não vou discutir com você.

Se por causa do nome de uma simples exceção, você acha que o Java implementa o conceito inteiro de ponteiros, bem, quem sou eu para argumentar. Afinal, chame de ponteiros o que você quiser.

Agora, eu estava explicando o conceito relacionado a ponteiros e referências. Porque, pela sua concepção, toda referência é um ponteiro então, talvez, vários anos de ciência da computação devem estar errados ao chamar ponteiros de ponteiros e referências de referências.

Também mostrei como o conceito do java se aproxima mais de referência do que de ponteiros e quais são as diferenças dele em relação as referências do C++.

Agora, se a justificativa de “o nome da exceção explica tudo” basta para você, me perdoe, mas só posso lamentar.

Só um sumário rápido.

As variáveis de tipos do usuário em java, se aproximam de ponteiros do C/C++ nos seguintes aspectos:

  1. Podem ter valor nulo;
  2. Podem trocar o objeto para o qual apontam.

E se aproximam das referências nos seguintes aspectos:

  1. Não podem sofrer aritmética;
  2. Não é possível obter o endereço exato de memória (seja ele relativo ou absoluto) através dela;
  3. Não é preciso usar sintaxe especial para utiliza-la;
  4. Não de pode deletar o objeto associado a elas;

Como o java não implementa exatamente nenhum dos dois conceitos. Deixo para vocês olharem a listinha ali em cima e chamarem do que quiserem. Mas pelo menos fico com a esperança do pessoal que veio do C++ não ficar confuso.

Uma benção que difere o conceito do Java do C++. Não há dangling pointers. Ou seja:
Uma vez que uma referência está apontando para um objeto válido, ela permanecerá apontando para esse objeto válido até que a referência seja atribuída a null.

Se você tinha preocupações com relação a ponteiros, essa afirmação deve acalmar seus nervos.

[quote=peerless]Tenho uma professora que diz: “em java , tuuuuuuuuuuuuuuuuudo é ponteiro”

ahuahuah[/quote]
Aponta para outra faculdade, que essa…

[quote=peerless]Tenho uma professora que diz: “em java , tuuuuuuuuuuuuuuuuudo é ponteiro”

ahuahuah[/quote]
Não diria que a professora é ruim, quem já deu aula sabe que nem sempre ser didático e ser exato combinam.

Além do mais, ela pode não estar falando para uma turma de ex programadores C/C++. Ou vocês viram C/C++ antes de java?

então vamos la… a implementação da maneira que as variáveis referenciam (ou apontam, elas não deixam de estar apontando né) em C é completamente diferente de Java à ponto de não ser possível nem compará-las ?

Olá

Não tenho a menor idéia (*) como o compilador C ou a máquina virtual Java internamente faz para cumprir as promessas que fazem aos programadores.

Só sei que C promete ter ponteiros e cumpre esta promessa. Java desde que foi lançado jura não ter ponteiros e quase todo mundo incluindo todos os teóricos javaneses acreditam neste juramento. Só que os incrédulos nunca me mostraram exemplos de ponteiros em Java.

[]s
Luca ((*) até sei que é diferente devido aos segmentos em uso e a questão de uso de pool de strings imutáveis, mas isto não vem ao caso)

Algumas pessoas referiram que Java não é listado no artigo da wikipedia como sendo uma linguagem com ponteiros. Aqui ficam dois outros artigos um pouco menos baseados na cultura popular que citam exatamente o contrario:

http://math.hws.edu/eck/cs124/javanotes3/java2cpp/s2.html
http://cslibrary.stanford.edu/106/

Cito estes por serem de universidades, mas existem muitos outros.
Estou chamando a atenção para este pormenor porque em ambos os casos poderemos ter um argumento falacioso. As citações servem apenas para mostrar que isto não é uma idéia loca que me ocorreu. É a opinião de muita boa gente.

Pedem-se provas de que Java tem ponteiros, como se isto fosse a inquisição.
Todas as linguagens que trabalham com tipos não primitivos têm ponteiros de alguma espécie. Fazer :

Date hoje = new Date();

É usar ponteiros.
Claro que, para aqueles que sentem a necessidade de ver um * para acreditar que estamos trabalhando com ponteiros este argumento nunca convencerá. Nem aqueles que esperam ver algo como *t + 2.

Aqui http://www.abiro.com/news/2006/10/opinion-on-java-is-java-using-pointers.html
Está uma boa ilustração do uso de ponteiros em Java.

Talvez para quem não conhece a linguagem bem seja importante pensar que Referencia e Ponteiro são dois conceitos completamente distintos e que nunca uma referencia pode ser um ponteiro ou vice-versa. Esse pensamento é bom quando se está aprendendo java pois ajuda a perder mensos tempo com isso e focar em coisas mais importantes. Agora, quando a pessoa já evoluiu além do simples feijão com arroz e se dá ao trabalho de pensar um pouco terá que concluir que aquilo que em java se chama referencia é na realidade um ponteiro sim.
Ponteiro não é um conceito que o C inventou, é um conceito no próprio amago da ciência da computação. C apenas implementa ponteiros com propriedades diferentes que os ponteiros do Java, mas são todos ponteiros. (leiam-se os artigos citados acima para mais detalhes)

Existem muitos argumentos a favor da existência de ponteiros em java, mas o unico argumento contra é o bitolado: “para ter ponteiro , tem que ter aritmética de ponteiros”. Java é uma tecnologia moderna que faz muita coisa por nós sem nós sabermos. Um exemplo é o collector de lixo, outro é o inlining, outro são os monitores de sincronismo. Tudo coisas que a tecnologia tem sem nós controlarmos , nem manipularmos, sem aritmética… Tudo coisas que,apesar de tudo, existem em Java.

[quote=sergiotaborda]Cito estes por serem de universidades, mas existem muitos outros.
Estou chamando a atenção para este pormenor porque em ambos os casos poderemos ter um argumento falacioso. As citações servem apenas para mostrar que isto não é uma idéia loca que me ocorreu. É a opinião de muita boa gente.[/quote]

Ninguém está dizendo que a sua idéia é oca, apenas existem pessoas aqui que não concordam e argumentam sobre isso.

[quote=sergiotaborda]Aqui http://www.abiro.com/news/2006/10/opinion-on-java-is-java-using-pointers.html
Está uma boa ilustração do uso de ponteiros em Java.[/quote]

Acho que a escolha desse texto foi um tanto quanto infeliz.

Acho que ele disse tudo né, ele chama do que quiser, então nós também temos o direito de chamar do jeito que nós quisermos :stuck_out_tongue:

Logo no início do outro texto:

Veja que ele fala “behind the scenes”, na linguagem Java não existem ponteiros, existem referências (veja que voce pode dizer que um ponteiro é uma referência, mas não pode dizer o contrário, uma referência só tem algumas das características de um ponteiro).

Como o Luca vem dizendo desde a primeira página, a JVM pode usar ponteiros lá internamente na implementação dela, mas em momento algum a linguagem Java demonstra ter ponteiros e em lugar nenhum da especificação do Java você vai encontrar uma afirmação de que Java tem ponteiros ou que é necessário implementar ponteiros pra poder ter uma implementação válida do Java, você precisa é de referências, e referências não são ponteiros.

Olá

[quote=James Gosling em http://news.zdnet.com/2100-9593_22-5563796.html]
if somebody gives you an object and says ‘This is an image’, then it is an image. It’s not like a pointer to a stream, where it just casts an image," said Gosling.[/quote]

Repito a última frase do white paper de maio de 1996 The Java Language Environment, 2.2.9 No More Pointers:
because there are no pointers in Java

Continuo afirmando, em todas as linguagens em que já programei (*), ter uma facilidade significa poder usar tal facilidade. Aliás é assim que a gente lista as facilidades do nosso software. E é por isto que o James Gosling, o Bill Joy, o Guy Stelle e outros pais do Java sempre afirmaram que Java não tem ponteiros.

(*) Fortran, Cobol, PL/1, APL, Basic, Clipper, vários assemblers, Pascal, Delphi, C, C++, Java, Visual Basic, Visual Fox Pro e agora aprendendo Scala e erlang. Se um dia precisar, aprenderei C#.

[]s
Luca

[quote=ViniGodoy][quote=peerless]Tenho uma professora que diz: “em java , tuuuuuuuuuuuuuuuuudo é ponteiro”

ahuahuah[/quote]
Não diria que a professora é ruim, quem já deu aula sabe que nem sempre ser didático e ser exato combinam.

Além do mais, ela pode não estar falando para uma turma de ex programadores C/C++. Ou vocês viram C/C++ antes de java?[/quote]

Sim, vimos c/c++, pascal, tudo antes de Java. :shock:

Sérgio,

Procure no google sobre “pointer definition c”.

Você vai encontrar a seguinte definição, citada em diversas páginas, diversas vezes:
“A pointer is a special kind of variable in C and C++ that holds the address of another variable”

Ou então:
“A pointer is a variable containing the address of another variable.”

Note que as definições tratam exclusivamente de encarar a variável como um endereço. O valor apontado por esse endereço é um efeito colateral disso. Mas a definição está tratando de endereçamento, não dos valores. Daí o por que de fazer sentido arimética de ponteiros. Programadores encaram somas e subtrações como mudanças nesse endereço.

A questão aqui é o conceito.

Referência é um tipo de ponteiro? Claro que sim. Mas um novo nome foi criado porque, se você fizer a mesma googlada para a definição de referência, vai ver que:
“In C++, a reference is a restricted type of pointer.”
“C++ references are often called aliases, since they do not allow address manipulation.”

Agora, porque separar em dois conceitos? Simplesmente porque pointers podem sofrer aritmética e porque pointers são mais inseguros de se usar do que as referências. Mas referências são ponteiros, então você também não está errado em dizer que java tem ponteiros. Mas a resposta assim fica incompleta, pois os ponteiros java são referências.

Além do que, quem geralmente pergunta está, na realidade, expressando um medo. Existe uma segunda pergunta velada: “Voltarei a ter pesadelos com ponteiros em java?”

Como eu venho repetindo direto, não. Os mecanismos de java previnem isso. Além do mais, todos os ponteiros de java são referências. E todo programador C++ sabe que referências são “ponteiros do bem”, que quase nunca apontam para posições inválidas, e que tem até uma sintaxe legalzinha. São só apelidos para objetos, não coisas sombrias e negras que podem estar apontando para qualquer lugar da memória, seja ele calculado ou não.

É por isso que eu digo: Não, java não implementa o conceito de ponteiros, mas apenas o de referência. Em momento nenhum, estou deixando de dizer que as referências usam ponteiros.

O conceito puro e simples de “uma variável que contém um endereço de memória”, não existe em Java.

Fala pessoal.
Apesar de o tópico ser antigo, acho que o artigo abaixo se encaixa no contexto:
http://www.softblue.com.br/public/blog/Memory_Leak.pdf

PS:Só a título de curiosidade.

[quote=fabiorubim]Fala pessoal.
Apesar de o tópico ser antigo, acho que o artigo abaixo se encaixa no contexto:
http://www.softblue.com.br/public/blog/Memory_Leak.pdf

PS:Só a título de curiosidade.[/quote]

Esse cara foi meu aluno. E um ótimo aluno. :slight_smile:

Tem aponteiros de todo tipo :laughing:, que aponta para as referências…