Afinal, java tem ponteiro?

60 respostas
JotaJota

Assunto dificil, complexo, que serve tanto para Java basico, como para Java avançado;

Já me falaram que java não tem ponteiro até eu conhecer um dos melhores programadores java e me falar que Java tem sim ponteiro!

Pois bem, façamos o seguinte…
lanço uma pergunta:

afinal, java tem ponteiro? por que voce afirma que si ou que nao?

[color=red] moderador: não use caps [/color]

60 Respostas

maquiavelbona

Cara, primeiro, tire as maiúsculas do título, parece que estás gritando e tornando seu tópico apelativo por causa disso.
Segundo, procurar não mata.
Procura no Google por “java pointer”
Primeiro link -> http://csis.pace.edu/~bergin/papers/JavaPointerTraps.html
Quarto link -> http://mindprod.com/jgloss/pointer.html

Busca no GUJ por “java ponteiro”

Isso não precisa de tanta exclamação por não ser um tópico tão polêmico.

Até!

ViniGodoy

Depende do que você chame de ponteiro.

O Java tem referências, o que é muito próximo do modificador & do C++, exceto pelo fato que as referências em java podem ser nulas.

Mas, não é possível descobrir o endereço de memória de uma referência. Por consequência, também não é possivel fazer artiméticas com o endereço apontado pela referência.

Finalmente, com o Garbage Collection, não é possível excluir um objeto referenciado e deixar o estado de outras referências inválido.

Java tem ponteiros? Se você considerar a referência um ponteiro, sim. Java tem as dores de cabeça da programação com ponteiros? Para isso, a resposta é não.

Luca

Olá

A gente diz que uma linguagem tem ponteiros quando pode usar os ponteiros. E quem já usou ponteiros no C por exemplo, sabe que sem aritmética de ponteiros eles não servem para nada.

Java NÃO permite o uso de ponteiros e consequentemente não tem aritmética de ponteiros.

Apague 3 cruzinhas da cartucheira do tal programador Java seu amigo.

[]s
Luca

T

Boa lucca… rs

T

Java != C#

C# tem os ponteiros, mas eles não devem ser usados indiscriminadamente. Na verdade seu uso torna os programas mais lentos (em vez de mais rápidos), por limitar algumas otimizações, e é desaconselhado.
Para lembrar o programador que está usando ponteiros, o C# exige que você use a palavra-chave “unsafe” e passe alguns parâmetros ao compilador para “liberar” o uso de “unsafe”.

sergiotaborda

JotaJota:
Assunto dificil, complexo, que serve tanto para Java basico, como para Java avançado;

Já me falaram que java não tem ponteiro até eu conhecer um dos melhores programadores java e me falar que Java tem sim ponteiro!

Pois bem, façamos o seguinte…
lanço uma pergunta:

AFINL JAVA TEM OU NÃO TEM PONTEIRO? PORQUE VC AFIRMA QUE SIM OU QUE NÃO???

Java sim tem ponteiro. É incoerente e impossivel pensar numa linguagem por objectos sem ponteiros. Em java , ponteiros são chamados de referência (reference).

O que o java não têm é aritmética de ponteiros. Em C vc pode somar ponteiros com números inteiros e obter outro ponteiro. Em Java isso não é possível.

A prova que Java tem ponteiros (pointer) está na existência da exceção mais chata : NullPointerException. Que significa: “Hei! Este ponteiro não aponta para lado algum!”

T

Isso me lembra aquela discussão de cinófilos.

Em Java não há “pointers” mas se usam muito “setters”:

Pointer

Setter

Infelizmente não existem raças de cachorros que são “getters”. Em vez disso, você pode encontrá-los em tubos de raios catódicos:

Getter

Luiz_Aguiar

meu deus thingol, vc merece um troféu… heheh :smiley:

T

Hoje é sexta-feira :stuck_out_tongue:

L

Um amigo meu tinha um Pointer, carro horrível só dava dor de cabeça.
Meu sonho de adolescente era ter um Passat Pointer.

(Sexta feira, eu pensando em ir embora, e o pessoal discutindo o sexo dos anjos… tsc,tsc,tsc).

Luiz_Aguiar

meu pai teve um passtão pointer gts 1.8, dúvido perder pra qualquer carro atual que custe menos de 40 mil. :smiley:
aquilo lá sim que era carro viu…

L

Luiz Aguiar:
meu pai teve um passtão pointer gts 1.8, dúvido perder pra qualquer carro atual que custe menos de 40 mil. :smiley:
aquilo lá sim que era carro viu…

Poxa era meu sonho… E quantas cervejas vai tomar no final de semana?

erickcellani

aff

Foxlol

hIOAUehUIAhehoiauheiae pelo que to vendo estes tipos de tópico de sexta num rola :stuck_out_tongue:

jPscoralicK

Em Brasília, 19h.

erickcellani

???

LPJava

erick nao liga nao… tem louco para tudo… mais respondendo a pergunta… quando li o livro da kathy ela falou “Quando você quiser apontar(isso eh java nao tem ponteiros), opa, referenciar para alguma variavivel vc faz…”

Entao pegando esse trecho da kathy… eu sempre achei que java nao tem ponteiro… e fico puto quando meu professor de java fica falando… “vc tem que apontar para tal coisa” eu fico com raiva…
enfim nao tem ponteiros em java… e sim referencias…

Luca

Olá

Sim, na especificação da linguagem diz na página 45, 4.3.1 Objects:
“An object is a class instance or an array.
The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object.”

Na frase pointers significa que apontam para os objetos e não que Java tenha ponteiros.

Quando eu aprendi minha primeira linguagem fiquei sabendo que ela tinha uma tabela de símbolos. Só que eu nunca consegui colocar nenhum símbolo lá e muito menos ler a tal tabela. O fato da linguagem usar internamente ponteiros ou tabela de símbolos não significa que a linguagem os disponibilize.

Eu nunca consegui usar ponteiros com Java mas se você acredita que existam então já deve ter usado. Pode dar um exemplo rápido do uso de ponteiros com Java?

Nem venha com referência na passagem de parâmetros porque isto Fortran já tinha no primeiro programinha que eu escrevi em 1969.

[]s
Luca (que gostou muito da resposta do Thingol)

sergiotaborda

Luca:
Olá

Sim, na especificação da linguagem diz na página 45, 4.3.1 Objects:
“An object is a class instance or an array.
The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object.”

Na frase pointers significa que apontam para os objetos e não que Java tenha ponteiros.

Se é isso que vc interpreta daquela frase, seja. Eu interpreto outra coisa.
O conceito de ponteiro é diferente do conceito de aritmética de ponteiros.
Parece que todo o mundo está achando que um implica o outro. Isso não é verdade.
Java tem ponteiros (NullPointerException) mas não permite arimética de ponteiros. Para deixar este fato claro, os ponteiros são chamados de referencia (já que não existe tal coisa como “arimética de referencias” esse nome não é ambíguo)
Mas como vc mesmo citou, na realidade as referencias são ponteiros.

“the reference values (often just references) are pointers” = " os valores de referência (chamados normalmente apenas de referências) são ponteiros"

Não ha forma mais clara de demonstrar que Java tem ponteiros, e que referencias são ponteiros, do que a fase que vc citou. Mas se mesmo assim continuar achando que Java não tem ponteiros …

O que vc nunca consegui usar foi aritmética de ponteiros. Os ponteiros vc usa a todo o momento.

Java não é uma religião e isto não se trata de acreditar. Se trata de entender os conceitos. Se trata de entender que “ponteiro” é diferente de “aritmética de ponteiro”. Entendendo isto, é simples entender que Java tem o primeiro e não o segundo.

Luca

Olá

Fortran tem referência logo Fortran tem ponteiros?

[]s
Luca (que ainda espera pelo exemplo de uso de ponteiros em Java)

jPscoralicK

apenas mais um comentário insano frente aos outros realizados!

sergiotaborda

Luca:
Olá

Fortran tem referência logo Fortran tem ponteiros?

[]s
Luca (que ainda espera pelo exemplo de uso de ponteiros em Java)

Fortran tem arrays ? Se sim , tem ponteiros.
http://pt.wikipedia.org/wiki/Ponteiro_(programa%C3%A7%C3%A3o)#Fortran

Agora vc está confundindo passagem por referência com referência. Isso é conversa para outro tópico.

Luca

Olá

Desculpe, agora eu pisei na bola. Esqueci que as novas especificações do Fortran tem ponteiros. Mas arrays sempre existiram em Fortran e a gente sempre fazia sistemas com endereçamento indireto, que na prática é como se usa algo parecido com ponteiro em uma linguagem que não tem ponteiros.

O argumento que estou desenvolvendo é que uma linguagem pode ter internamente no compilador ponteiros, tabelas de símbolos, tabelas hash, etc. mas o que importa para o programador é se a linguagem fornece meios de usar.

Java não fornece nenhum meio de usar ponteiros. Já as linguagens que tem ponteiros fornecem constructs para isto.

Não sei há quanto tempo você usa Java. Eu comecei desde a primeira versão 1.02 que todo mundo baixou na Internet em 96 mas poucos usaram. Eu comprei logo 2 livros. Todos os textos de Java afirmavam que entre as grandes vantagens do Java, uma era não ter ponteiros. A outra grande vantagem era ter exceptions mas isto é papo para outro choppe.

Por isto sempre que alguém diz que Java tem ponteiros peço simplesmente para mostrar como usa. Até hoje ninguém mostrou.

[]s
Luca

sergiotaborda
  1. A pergunta é : Java tem ponteiros ?
    A isto so se pode responder sim ou não. A pergunta não é “Posso usar/manipular os ponteiros ?”

A resposta à pergunta é : Sim, Java tem ponteiros.

2)Se a pergunta fosse : Java permite manipular ponteiros ?
Ai a resposta seria: Não.
Mas infelizmente essa não foi a pergunta.

  1. Vc parte do principio errado de que “Só tem ponteiros se eu os puder manipular” O que vc está pensando é : “Java tem ponteiros mas não os expôe ao programador”. Ah! bom, mas a pergunta não era: “Java expõe os seus ponteiros?”
    É mais ao mesmo como “Vc só tem alma se eu a puder ver”. Este tipo de argumento é sem sentido. Mas vamos deixar então claro de uma vez por todas:

Q) Java tem ponteiros ?
R) Sim, tem.

Q) Java expõe os ponteiros de forma que o programador os possa manipular ?
R) Não. Java não expoe os seus ponteiros.

Q) Java permite o programador usar aritmética de ponteiros ?
R) Não. Java não permite isso.

P

C: Função / JAVA: Método.
C: Ponteiro / JAVA: Referência (sem aritmética de referências)

Falow

Luca

Olá

sergiotaborda:

3) Vc parte do principio errado de que “Só tem ponteiros se eu os puder manipular”

Errado na sua ótica, porque nenhum dos seus argumentos me convenceram de que há ponteiros na linguagem.

Durante os 39 anos que tenho participado do desenvolvimento de sistemas ou dando aulas, pois já dei muitas aulas de programação, sempre que alguém me perguntou se uma linguagem tem esta ou aquela facilidade, o intuito da pergunta sempre foi saber se era possível usar tal facilidade.

Perguntar se tem ponteiro internamente para uso do compilador nunca vi e acho que a sua interpretação da pergunta só tem o intuito de sofismar.

Mostrei a voce a especificação para que você conferisse a única citação a ponteiro. Uma maneira de se definir uma referência é citar ponteiro porque o termo referência (&) é usualmente ligado ao conceito de ponteiro (*).

Nesta questão prefiro ficar com os teóricos que criaram a linguagem.

[]s
Luca

JotaJota

As respostas foram muito boas, vlw!
ah desculpa pelo caps ligado! =\ eu tenho mania de digitar titulos assim!
e realmente a resposta do catalizadoor lah foi d+++
=D
eu entendi sim o ponteiro e admiro a quantidade de informações que vc tem…
quanto ao comentario de que é ou nao polemico esse assunto … bom eu acho que é sim… pra ter duas paginas de opniões e estudos diversos… Se não fosse polemico, teria apenas uma resposta :wink:
vlw pela dica de entender o ponteiro!!
abração pra todos

sergiotaborda

Luca:
Olá

Duas palavras que resumem esta citação: ad verecundiam
http://devir.wordpress.com/2006/11/16/mentiras-sinceras-me-interessam-parte-primeira/

O seu argumento é: Só existem ponteiros em Java se o programador os poder manipular.
Este argumento é falacioso. Repare que eu poderia dizer que:
Só existem strings em Java se o programador as poder manipular.
Aqui estaria certo, mas eu disser :
Só existem referencias em Java se o programador as poder manipular.
Isto é obviamente errado.
Conclui-se que a existência de um recurso na linguagem independe da existência de operadores em cima desse recurso. Concluído isto a existência de operadores independe da existência de operadores sobre eles.
A implicação é: "Se existem operadores sobre X =&gt existe X". Mas o inverso não é verdade, proque aquilo ali é uma implicação e não uma equivalência Ou seja: "Se existem operadores sobre X &lt=&gt existe X" É falso.

Se você, mesmo assim, não consegue entender a diferença e ver que a sua posição é equivocada por se basear numa equivalência que não existe, então não sei mais como lhe explicar que está enganado.

Alguém vai dizer que "ponteiro" é uma implementação de referencia e que
a linguagem java não usa ponteiros porque isso é algo que apenas a JVM pode fazer. A linguagem java e a java virtual machine são coisas separadas e ponteiro é apenas uma implementação pela jvm do conceito de referência usado na linguagem. Isto é tudo verdade. O problema é que não existe hoje nenhuma outra tecnologia que permite implementar referencias além dos ponteiros. Então, a bem ou a mal, doa a quem doer, Java é hoje forçado a usar ponteiros, porque não ha hoje como implementar uma JVM sem eles. Java (a palavra sozinha e sem mais qualificativos) diz respeito à tecnologia Java , que incluem ambas a linguagem e a jvm.

Alguém vai dizer que esta separação entre ponteiro e aritmética de ponteiro é fútil. Se isso fosse verdade a separação entre numero e adição também seria fútil, assim como todos os conceitos que derivam dessa separação , como o conceito de grupo.
A separação não é fútil e é ela que nos deixa observar como Java é uma evolução no panorama de TI por ter desafiado o uso da aritmética de ponteiros do C, e se ter dado bem.

davidbuzatto

sergiotaborda é brasileiro e não desiste nunca.

:stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

JotaJota

Boa SErgico!

Lich_King

Uma referência não é um ponteiro para um objeto?

davidbuzatto

Caramba! Java não tem ponteiro! Que raiva! Que gente teimosa!

cv1

Sim, nao deixa de ser um ponteiro. Mas ele eh gerenciado pela JVM e vc nao pode fazer aritmetica com ele (coisa que provavelmente ja foi dita antes nessa thread, mas eu nao tive saco de ler).

Mauricio_Linhares

Deus do céu!

Companheiro, muito antes do Gosling sonhar com Oak, já haviam linguagens que rodavam em máquinas virtuais com gerenciamento de memória automático, Java não desafiou ninguém não. Acho que você não pegou a idéia, Java não tem os ponteiros de C, as referências ou “ponteiros” (chame do jeito que você achar melhor) em Java são diferentes, simples assim. Ponteiros como em C não existem em Java, então não dá pra comparar os dois como se fossem a mesma coisa só porque alguém teve a idéia de chamar pelo menos nome (esse alguém não sendo a especificação da linguagem, que chama de “reference”).

Pra que complicar tanto uma coisa tão simples?

ViniGodoy

Eu concordo.

Eu prefiro dizer que java não tem ponteiros, justamente porque quem pergunta isso está se referindo aos ponteiros de C/C++.

Nesse caso, ponteiros são variáveis que contém o valor de endereços de memória e, portanto, podem apontar para algum objeto, tipo primitivo concreto, ou mesmo para uma área proibida da memória.

Ponteiros são inseguros, podem sofrer arimética, e é isso que os torna distintos das referências. Em C++, referências não podem ter valor nulo, o que as diferencia do java.

Em C++, você também pode excluir um objeto apontado por um ponteiro com o operador delete. Com referências, você não pode fazer isso. No java, não há operador delete, pois há garbage collection.

Portanto, java não tem ponteiros. O conceito dele se aproxima muito mais das referências, embora possam ter valor nulo. Estamos falando aqui do conceito de ponteiros e de referências.

Na prática o compilador vai transformar tudo para ponteiros, e então, obviamente a linguagem terá ponteiros. Da mesma forma, o compilador pode transformar certas variáveis concretas em ponteiros também. Mas acoh que quem pergunta não está interessado em saber se o compilador do java gera ponteiros e sim, se o conceito de ponteiros que tanto causou trauma nas aulas de C++ está lá, e se ele terá os bons e velhos problemas de dangling pointers, memory leaks, e operações ilegais sendo executadas.

Portanto, volto a repetir. A linguagem java não tem ponteiros* e sim referências& que podem ser nulas.

sergiotaborda

Deus do céu!

Companheiro, muito antes do Gosling sonhar com Oak, já haviam linguagens que rodavam em máquinas virtuais com gerenciamento de memória automático, Java não desafiou ninguém não.

As palavras chave da frase eram “e se deu bem”. É verdade que muitas outras linguagens eliminaram a aritmética de ponteiros, mas nenhuma teve o sucesso que Java tem.

Quanto ao resto, já disse o que tinha a dizer, não me vou repetir.

sergiotaborda

ViniGodoy:

Portanto, volto a repetir. A linguagem java não tem ponteiros* e sim referências& que podem ser nulas.

Então explique porquê existe a classe NullPointerException.
Vc vai dizer que o povo da sun deu o nome errado , deveria ser NullReferenceException. Pois, mas não é. Então, porque não é?
a)Se Java não tem ponteiros porquê criar uma exceção que fala deles ? Afinal o ponteiro só pode ser nulo se ele existir em primeiro lugar. E se ele não existe, pq falar dele ?
b)Se java tem ponteiros, a exceção é complementa normal, pois indica que o ponteiro ainda não aponta para lugar algum.

Se vc responder que o nome é um engano do povo da Sun e deveria ser NullReferenceException, então seremos obrigados a concluir que eles não sabem dar nomes às coisas, e portanto, referencia, pode muito bem ser um nome para pointer, só que eles se enganaram…

ramilani12

Ah essa pergunta só pessoal da Sun poderá em lhe responder …

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

peczenyj

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?

L

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

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…

ramilani12

Sobre ponteiros uma boa dica é esse artigo no Wikipedia

Pointer

Em nenhum momento o autor citou Java

Link_pg

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… =]

Mauricio_Linhares

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.

peerless

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

ahuahuah

ViniGodoy

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.

ViniGodoy

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.

L

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

ahuahuah


Aponta para outra faculdade, que essa…

ViniGodoy

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

ahuahuah


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?

Link_pg

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 ?

Luca

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)

sergiotaborda

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.

Mauricio_Linhares

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.

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

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.

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.

Luca

Olá


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.

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

peerless

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

ahuahuah


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?

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

ViniGodoy

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.

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.

ViniGodoy

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.

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

Ivan_Ferrer

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

staroski

Sim, as referências são ponteiros.
O que Java não tem é aritmética de ponteiros.

Criado 1 de junho de 2007
Ultima resposta 9 de dez. de 2019
Respostas 60
Participantes 26