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).
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?
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.
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.
[/quote]
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.
[quote=ViniGodoy]
Portanto, volto a repetir. A linguagem java não tem ponteiros* e sim referências& que podem ser nulas.[/quote]
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…
Ah essa pergunta só pessoal da Sun poderá em lhe responder …
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
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:
-
No tópico “Suporte em linguagens de programação” o Java não é citado
-
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
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:
- Podem ter valor nulo;
- Podem trocar o objeto para o qual apontam.
E se aproximam das referências nos seguintes aspectos:
- Não podem sofrer aritmética;
- Não é possível obter o endereço exato de memória (seja ele relativo ou absoluto) através dela;
- Não é preciso usar sintaxe especial para utiliza-la;
- 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.