Java 1.7 (Dolphin) vai ter ponteiros?

Olá

Sim

Não, porque o que eu consigo armazenar no se exemplo é o conteúdo do endereço e não o endereço. Mande imprimir o tal “a” e se ele mostrar Null e sua teoria for correta, o seu computador será o primeiro no mundo com endereço Null.

Por mais que você insista em forçar a barra, FORTRAN e Java não tém ponteiros.

Mas ainda lhe dou outra chance de representar ponteiros com Java. Só que desta vez mande seu exemplo direto para o blog do Gosling porque aqui já percebi que você é teimoso demais para admitir que está errado.

[]s
Luca

Engraçado que o video linkado usa exatamente objetos para modelar ponteiros (assim como usamos objetos para modelar Usuarios, ContaAPagar, etc) para explicar como estes funcionam. O que seria o valor do ponteiro acaba virando um atributo no objeto, já que nao há ponteiros em java, apenas referências. O exemplo em C, entretanto, usa ponteiros de verdade já que não é preciso simular ponteiros nesta linguagem.

[quote=Luca]Olá

Sim

Não, porque o que eu consigo armazenar no se exemplo é o conteúdo do endereço e não o endereço.
[/quote]

Vc está inventando ou está confundindo. O conteudo do endereço e o endereço são a mesma coisa. O conteudo de “Rua Afonso” e “Rua Afonso” são a mesma coisa. Afinal qual é o conteudo de uma variável de endereço ? um numero. O numero é o valor da variável de endereço, do ponteiro. Em java (JVM da sun) vc consegue saber esse numero pelo System.identityHashCode(). Então ele existe, está lá. O facto de não conseguir manipulá-lo não significa nada. É apenas encapsulamento. Mas até manipulá-lo vc pode . Desde que da forma aceite pelo Java (atribuição)

Acho que vc está confundindo Ponteiro com o “Tipo ponteiro” do C. Ponteiro é uma variável que contém um endereço, “tipo ponteiro” é um tipo primitivo do C ( que aliás nem é um tipo primitivo, é um operador, mas tudo bem) que permite conter Ponteiros e manipula-los como se fossem inteiros ou bytes. O Java não tem “tipo ponteiro” neste sentido ( variável que contém variável de endereço), mas tem ponteiros: variáveis que contèm um endereço.

Não é sério discutir ponteiros em Java utilizando os conceitos da linguagem C. Seria como discutir C utilizando conceitos de GC.

Em java vc não consegue imprimir ‘a’ sem lhe atribuir algo primeiro. O compilador não permite que vc deixe uma variável sem atribuição, por isso não é possivel mostrar que ‘a’ é null. contudo podemos usar um método para que o compilador aceite.
Execute este codigo:

public class teste {

	public static void main(String[] args) {
		
		printIt(null);
		
	}

	
	public static void printIt(Object any){
		System.out.println(any);
	}
}

O que aparece na tela é “null”. Tal como vc quer.
Agora vc vai-se descupar com algum disse-que-não-disse para afirmar que aquele codigo não prova o ponto. Mas foi vc que pediu.
É vc que não quer aceitar.

Na boa, teimosia é uma faca de dois gumes. Você já pensou que pode ser você que não quer admitir que está errado?

Você parte do principio que um ponteiro em java deveria ter a mesma notação ou a mesma forma que um C ou C++. Porquê teria ?
Afinal Java é uma linguagem diferente. String não tem a mesma representação em C ou C++ , nem Fortran, nem VB, nem C#. aliás nem inteiros têm a mesma representação. Mas isso não significa que não existe uma representação. Porque é dificil de aceitar que para ponteiros não é diferente ?

Diga-me então, se em java não ha ponteiros o que null seria ? Não é int, nem short , nem byte, nem long , nem Object. Então, o que ele é ? O que significa para vc a instrução abaixo ?

Integer a = null;

Se vc me diz que Java não tem variáveis que podem conter variáveis, eu concordo. Mas se me diz que não tem variáveis que contêm endereços, não concordo. E não é uma questão de teimosia. É uma questão de lógica. De seguir as definições.

E da mesma forma que interessa um rabanete que um dos autores do livros de certificação não tenha conseguido passar no proprio teste que criou interessa uma rabanete o que Gosling pensa ou acha sobre ponteiros em java. Java não é propriedade dele, nem ele é deus em java. Se vc está tão preocupado com a opinião dele, envie-lhe a resposta você mesmo.

Adendo

Se java não tem ponteiros o que == testa ? A igualdade das referencias ? O que seria isso ?

Qual é a condição para que uma referencia seja igual a outra ?

Se me disserem que é :“que aponte o mesmo objeto” temos um problema.

Em C++ uma referencia não aponta o objeto. E duas refrencias nunca são iguais ( porque senão não seriam duas, seria um só)
Em C++ a referencia é uma variável que contém o objeto. É o objeto em si mesmo.
(http://www.parashift.com/c+±faq-lite/references.html)

então duas referencias nunca podem ser iguais. O que pode ser igual é o objeto referenciado por elas, ou o ponteiro subjacente.

então, o que == testa ?

[quote=sergiotaborda]Ponteiros … O java vai ter ponteiros… essa é uma afirmação engraçada porque java já tem ponteiros.
O que java não tem é aritmética de ponteiros. É como ter numeros e não ter operações aritméticas.
Alguns vão dizer “para que servem os numeros sem as operações?”. Servem para o mesmo que Date sem operações de soma, subtração, intervalo, etc… e mesmo assim usamos Date.
A utilidade não tem nada a ver com a existencia.

Variaveis que apontam a memória é uma necessidade fisica dos sistema informáticos de hoje e não é fisicamente possivel construir um sistema programável sem eles. Logo, todas as linguagens os têm.
A diferença é como podemos trabalhar com eles. Ai sim, as coisas são diferentes. Mas acesso e existencia são duas coisas diferentes.

Java sim tem ponteiros. Mas algumas pessoas acham que ponteiros só existem se existirem operações sobre eles. É como dizer que 2 só existe se poder ser somado com 3. Bom, então não podem negar que java tem ponteiros porque java tem operações sobre ponteiros. O que java não tem são operadores que atuam sobre ponteiros ( como o & e o + do C). Java não tem operadores para quase nada, por isso não ha muita novidade nisso. Ter um + para String já é um alivio. (e não realidade nem sequer é um operador é apenas açucar sintático com o for extendido: i.e. truques de compilação)

A definição de ponteiro é: variável que guarda um endereço da memória. É dito que ela “aponta” a memória e dai o nome ponteiro. Uma boa explicação do conceito pode ser lida aqui.

Isso é um ponteiro. uma variável cujo valor é uma posição na memoria. Tecnicamente uma variável só é um ponteiro quando está preenchida já que sem o valor ela não aponta para lado algum, mas como abuso de linguagem dizemos que a variavel é um ponteiro se poder conter um endereço de memoria.

Ora, objetos não são transportados de um lado para o outro como se fosse fardos de palha.O objeto existe em um endereço de memória ( que na implementação da JVM da Sun pode ser consultado com um simples System.identityHashCode()) é a variável com esse valor, que viaja de um lado para o outro e isso é um ponteiro pela definição acima. Logo, java tem ponteiros. Mas como eles só são válidos quando preenchidos a falha em os preencher ocasiona uma exception : NullPointerException. Que signifca que o ponteiro é nulo, ou seja, a variável não aponta para lugar algum. Mas porque acontece esse erro ? (continue lendo)

Bom, o ponteiro é apenas uma váriável com um endereço. Para que possamos trabalhar com o objeto temos que obter aquilo que se chama uma referencia. A referencia é como se fosse o objeto em si mesmo. Ou seja, uma referencia seria uma “imagem” do objeto, um “fantasma”, já que o objeto real nunca saiu do lugar onde estava. Uma variável de referencia seria uma variável que guarda a referencia. A referencia não é o endereço da memoria. é algo mais. É um conjunto de metadados sobre o objeto ( o tipo, por exemplo).

Em C e seus primos temos que obter a referencia explicitamente porque a variável cujo valor é um enredeço é um tipo por si mesmo. Então para obter a referencia, que é um outro tipo, temos que construir outra variável e usar a primeira para puxar a referencia. É mais ou menos como ter um array e puxar um dos seus valores. Variáveis de Array e a Variável do Valor não são do mesmo tipo.

Em C isso é feito com um operador (&). Em java isso é feito automáticamente.
Porque é automático, as pessoas acham que não existe. E esse é o problema. É isso que causa confusão porque as pessoas se esquecem da diferença entre ponteiro e referencia.
Em C temos a operação inversa, que a partir de uma referencia obtemos um endereço de memoria que se chama desreferencia. (esta necessidade é obvia, porque embora a referencia seja mais coisas que um endereço, o endereço é fisicamente necessário à electronia da coisa e no fim de contas é sempre necessário)

Ora, porque a operação de obtensão de referencia é automática em Java pode acontecer que quando ela é executada o ponteiro não tem valor. Ou seja, a variável não foi preenchida e portanto não aponta para lugar algum. Por isso o java - inteligente como é - lança um NullPointerException dizendo “Eih! mané! vc espera que eu execute uma operação de referencia sobre um ponteiro vazio ? Tá louco?! Vá se @#@#! Segura esta exceção!” e lanca NullPointerException. Em ponto algum ha uma referencia envolvida aqui, porque para ela existir, é preciso existir um ponteiro (válido) primeiro. Quando o ponteiro é válido a referencia é obtida e as coisas prosseguem.

Só que o Java não tem o tipo de variável “referencia” que o C tem ( Seria inutil de qualquer forma devido ao mecanismo automático do java) A questão é que uma vez obtida a referencia é usada e descartada, então é como se ela não existisse.

Quando se faz nome.toString() o “.” significa “obtenha a referencia do objeto apontado por ‘nome’, e a partir dele encontre a referencia de “toString” e execute”.
Em C++ seria mais trabalhoso porque teriamos que passar de nome (ponteiro) para nome& ( referencia) para depois executar o operador “.” do C++. O “.” do java é mais esperto ele faz tudo de uma vez só.

E porque o Java usa ponteiros então ? Porque o ponteiro é mais leve que a referencia. E porque o java tem um meta-framework que lhe permite ter as informações da referencia em outro lugar: o classloader.
O C++ não tem isso. É o gerenciamento do Java que permite simplificar as coisas. De quebra oferece mais segurança. Não ha como mexer com o valor do ponteiro , então não ha como fazer asneira
Bom, na verdade, ha uma única forma de mexer com o ponteiro: atribuição. ( e já são duas operações sobre ponteiros)

Integer a = new Integer(1);

Este comando são 3 coisas:

  1. Crie uma variável de ponteiro. (Integer a)
  2. Crie um objeto (new Integer(1))
  3. atribua o endereço do objeto à varável (=).
a = null;

Significa: Atributa “null” À variável. ou seja: faça este ponteiro apontar para nenhum lugar.

O facto de va atribuir null a uma variável significa resetar o ponteiro, significa que ‘a’ é um ponteiro para começo de conversa. null não é um objeto, não tem uma refrencia. é a representação do endereço especial que significa “lugar nenhum”. E como não se pode dizer que maças são laranjas, se algo recebe um endereço, tem que ser um ponteiro. Java é strong-typed não duck-typed: se referece X é porque é X.

Falta então esclarecer porque os javaneiros chamam “variável de referencia” às varáveis que apontam objetos.
Porque o “referenciamento” é automático no java, em termos práticos é irrelevante se x é um ponteiro ou uma referencia. Repare que quando ha necesidade de usar operadores explicitos não temos comutatividade ou seja , a variável de endereço e a de referencia são diferentes e destinguiveis:

String a (ponteiro)
String& b = &a; (referencia obtida do ponteiro)

Mas com o modo automático não ha como saber quando acontece a operação de “referenciamento”. Tanto faz, já que nunca o programador irá manipular o ponteiro. Então tanto faz deixar o ponteiro sendo o ponteiro e executar o “referenciamento” quando alguma operação cai nele ( tipo '.") ou já fazer o “referenciamento” antes e depois seguir dai. Por questões de eficiencia um tem vantagem sobre o outro, é melhor deixar o ponteiro ser o ponteiro.

Mas a cabecinha dos javaneiros de primeira viajem não pode comportar toda esta explicação logo no primeiro dia de contacto com a linguagem. Então para simplificar e para afastar o Java do C++ e suas práticas hediondas, é mais facil dizer que o java tem apenas variáveis de referencia ( quando na verdade não tem, mas na prática tanto faz).

Ora, isso seria credivel não fosse por dois promenores que denotam o embuste: NullPointerException e “=null”
Como todos sabemos null não é um objeto, então o que ele é ? Um tipo primitivo ( não ha mais tipos em java)
Logo , qual é o tipo primitivo de null ? Ponteiro ou Referencia ?

Uns continuaram dizendo que referencia, porque na prática é isso que se vê. Outros dirão que ponteiro, porque é isso que é fisicamente real.

Tanto faz, porque no fim, embora o java mantenha ponteiros, o programador só trabalha com referencias.
Quando um vira o outro é a JVM que decide e portanto é absurdo dizer que um , ou o outro, não existe.

Mas temos que aceitar que não ha referencia sem ponteiro. Mesmo no C++. Logo, se aceitamos a existencia de referencia, temos que aceitar a de ponteiro.

Java tem ponteiros ? Sim. É uma necessidade fisica, electronica, que existam.
Você pode executar operaçoes sobre eles ? Sim. (obtenção de referencia, atribuição)
Você pode alterar o seu valor ? Sim, desde que seja de algo para null ou de null para algo. Não como em C em que pode atribuir um valor qualquer. Isso limita o dominio da atribuição, não a atribuição em si.
Você pode ler o seu valor ? Não directamente. ( em C sim)
Se não pode ler o valor do ponteiro qualquer é a importancia dele em Java ?
É que sem ponteiros, não ha referencias.

Preciso saber o que é um ponteiro para usar Java ? Não se souber a diferença entre == e equals();
Preciso saber o que é um ponteiro para me chamar programador ? Com certeza.

Sobre a confusão entre ponteiro e operação sobre ponteiro aqui

[/quote]

Alguém se lembra dos problemas do começo do desenvolvimento Corba-Java ? A porra do problema de apontar apenas referência e não valor ? Java tem ponteiros sim, apenas não são manipulados pelo desenvolvedor.

Excelente explanação.

[quote=Kenobi]
Alguém se lembra dos problemas do começo do desenvolvimento Corba-Java ? A porra do problema de apontar apenas referência e não valor ? Java tem ponteiros sim, apenas não são manipulados pelo desenvolvedor.

Excelente explanação. [/quote]

Voc6e mesmo se respondeu. Ponteiro é uma coisa, referência (remota ou local) é outra. Não há porque chamar referência de ponteiros já que linguagens que implementam ponteiros (C, C++, pascal…) também possuem refer6encias que não são ponteiros…

Uma referência do Java é mais e menos que um ponteiro.

Mais que um ponteiro, porque a JVM (através do Garbage Collection) pode mover a memória apontada (referenciada) para um local mais adequado.
Além disso, não é necessário que a referência aponte para um objeto no heap; ela pode estar apenas sendo um sinônimo para um objeto no stack dependendo de alguma otimização da JVM.

Note que o que é mais semelhante a uma referência do Java no C++ é o template shared_ptr<> (disponível em www.boost.org ou então no namespace std::tr1 em compiladores mais modernos), e mesmo esse não suporta garbage collection, mas sim contagem de referências, o que dá problemas com estruturas de dados circulares.

Ela é menos (e neste ponto menos é mais) que um ponteiro, porque não suporta as operações perigosas associadas a ponteiros. Por exemplo:

  • Não se pode usar uma referência do Java para indexar um array.
  • Não se pode usar uma referência do Java para acessar um endereço arbitrário de memória.
  • Não ocorre o caso de uma referência apontar para uma região desalocada (portanto inválida) da memória.

[quote=sergiotaborda]Adendo

Se java não tem ponteiros o que == testa ? A igualdade das referencias ? O que seria isso ?

Qual é a condição para que uma referencia seja igual a outra ?

Se me disserem que é :“que aponte o mesmo objeto” temos um problema.

Em C++ uma referencia não aponta o objeto. E duas refrencias nunca são iguais ( porque senão não seriam duas, seria um só)
Em C++ a referencia é uma variável que contém o objeto. É o objeto em si mesmo.
(http://www.parashift.com/c+±faq-lite/references.html)

então duas referencias nunca podem ser iguais. O que pode ser igual é o objeto referenciado por elas, ou o ponteiro subjacente.

então, o que == testa ?
[/quote]

Sergio ate entendo seu ponto de vista mas se java tem ponteiros como posso realizar aritmetica de ponteiros em Java? , E qual relevancia do Garbage Collector?
Essa não seria a gde diferença entre Java X C/C++, não se preocupar em “alocar” memoria para um objeto e depois “desalocar”?

Java têm suporte a data. Java realiza aritmética de datas ? Não.
Java têm suporte a endereços ip. Java realiza aritmética de endereços ip ? Não.
Java têm suporte a conjuntos. Java realiza arimática sobre conjuntos ? sim. Java tem operadores para isso ? não.

O facto de existir X e existir arimética sobre X são coisas separadas. É claro que para existir arimética tem que existir algo sobre a qual a utilizar ( um corpo) , mas o facto de existir esse algo não implica que ha uma arimética. Muito menos que java implementa essa aritmética.

Se arimética sobre X existe => X existe.

A implicação inversa não é verdadeira. E por isso a sua pergunta incorre num falso argumento porque é baseda numa falacia logica.

[quote]
E qual relevancia do Garbage Collector?
Essa não seria a gde diferença entre Java X C/C++, não se preocupar em “alocar” memoria para um objeto e depois “desalocar”?[/quote]

A JVM corre numa computador, certo ? E ela usa memoria, sim ? Então “não se preocupar com a memoria” é um termo relativo.
Depende da prespectiva. O programador não tem que se preocupar com isso. Mas a JVM sim. O mecanismo do GC e toda a implementação da JVM no seu conjunto se preocupa com isso. Mais uma vez vc estã tentando inverter a implicação.

“Java” é o quê ? É o que o programador faz ou o que a JVM faz ? É o que a JVM faz. Logo, se ela usa X, X existe em Java.

Mas o ponto nem é esse. Pese embora a JVM controle a memoria e o programador não se preocupe com os valores dos endereços.
Esses endereços têm que estar em algum lugar. É uma impossibilidade fisica, electronica, não os ter. Java tem ponteiros, pese embora o programador não os manipule directamente, ele os manipula indirectamente. (atribuição de null, uso de == e tratamento de NullPointerException). No dia que vc disser “Referencia é uma coisa que aponta o objeto” vc está dizendo que referencia é um ponteiro (aponta). A questão é se a referencia em java é um endereço da memoria ou algo mais. É com certeza algo mais, mas não deixa de ter o endereço lá. Como já falei, a permuta entre o endereço fisico e o endereço logico (a referencia) é da responsabilidade da JVM e o programador não tem nada a dizer sobre isso. Contudo ela existe. O facto de estar encapsulado não implica em que não existe.

Olá

Fortran sempre teve tabelas de símbolos só que não são manipulados pelo desenvolvedor.

De todas as linguagens que aprendi, não me lembro no momento de nenhuma que não tivesse referências. Pergunte a algum programador Cobol, Fortran ou Clipper como ele usa pointer em Cobol, Fortran ou Clipper.

Se alguém for escrever algum tipo de linguagem para ser executado em um computador digital, no momento em que se carregar uma instrução na CPU para fazer alguma coisa com alguma posição de memória esta ação referenciará a uma posição da memória ou a um registrador. O que estão dizendo neste tópico é que todas as linguagens tem ponteiros porque estão confundindo referências com ponteiros.

[]s
Luca

Olá

Desculpem-me mas não tenho tempo para ler as respostas do Sérgio que são muito grandes e portanto não sei se ele já disse isto.

O que gostaria é de um exemplo de alguma linguagem sem referências. Para não parecer exceção, por favor citem umas 3 dentre as mais conhecidas. Nada de brainfuck ou outra coisa mais estranha.

[]s
Luca

Exactamente. Por isso Assembler tem ponteiros.

É exactamente ao contrario “Todas as linguagens com referencia tem ponteiros porque para construir referências são necessários ponteiros”

Vc consegue diferenciar “ter” de “usar” e de “manipular”, sim ?

[quote=pcalcado]
Ponteiro é uma coisa, referência (remota ou local) é outra.[/quote]

E qual a diferença ? Sempre entendi que ponteiro é algo que aponta à uma referência. Você ter manipulação direta sobre eles é outra questão. Poderia explicar a diferença ?

não sei se é isto que quer mas:
VB6 não tem objetos nem referencias. Também não tem operadores nem arimética de ponteiros.
Eu posso escrever

Dim a as Integer

E isso seria o quê senão um ponteiro ?
(toda a familia Basic, execto o VB.NET se escusa tanto do conceito de objeto tanto quando do conceito de variável que aponta variável de endereço , aka “Tipo ponteiro”)

Poderia dar o exemplo do matlab, mas não sei se entra na categoria de “linguagem desconhecida”.

O que eu entendi desde o começo do tópico é que estávamos falando de ponteiros como algo manipulável pelo programador.
Usando termos até leigos, é bastante óbvio dizer que todas as linguagens usam algo para apontar para a área de memória onde está o conteúdo que precisam manipular, e podemos chamar este algo de ponteiro.
Desde o princípio dos tempos, a função das linguagens de programação sempre foi abstrair a complexidade da linguagem de máquina, através de uma camada humanamente legível e compreensível.
Uma destas grandes complexidades com certeza é a manipulação de ponteiros.
Java faz este trabalho pelos humanos.
A conclusão óbvia, portanto, é que java, do ponto de vista da linguagem de programação, não usa ponteiros.

Segundo a definição lá na wikipedia, referência contém informações que indicam dados armazenados em algum outro local ao invés de conter o próprio dado.

Ainda por lá, ponteiro é uma implementação simples de referência.

Ah, e para o Luca que queria ver ponteiro com Fortan:

[code]type real_list_t
real :: sample_data(100)
type (real_list_t), pointer :: next => null ()
end type

type (real_list_t), target :: my_real_list
type (real_list_t), pointer :: real_list_temp

real_list_temp => my_real_list
do
read (1,iostat=ioerr) real_list_temp%sample_data
if (ioerr /= 0) exit
allocate (real_list_temp%next)
real_list_temp => real_list_temp%next
end do
[/code]

Mas eu não quero entrar na briga. Volto na minha pergunta que todo mundo ignorou:

Closure é um tipo de referência/ponteiro para função/método? Serve pra mais alguma coisa? Pelo que entendi, e na minha opinião, é só mais um auxílio para o programador, assim como o operador + nas Strings, o foreach e o autoboxing, só que com uma sintaxe muito bizarra. Ou não. Alguma opinião?

Sendo que em java vc tem variáveis primitivas e variáveis polimorficas de Object e closures não é nenhuma das duas fica dificil responder. Claro que podemos aceitar um tipo de variável novo (closure) incompreensivel ao java 1.6 e anteriores.

Por detrás dos panos é uma inner class anonima só que a jvm 7 tem instruções diferentes que fazem com que na realidade seja algo semelhante a um referência/ponteiro para um método. Essa mesma instrução será utilizada pela linaguagens de script como Groovy e JRuby para aumentar a sua performance. Pelo menos isto foi o que eu li por ai…

[quote]
Serve pra mais alguma coisa? Pelo que entendi, e na minha opinião, é só mais um auxílio para o programador, assim como o operador + nas Strings, o foreach e o autoboxing, só que com uma sintaxe muito bizarra. Ou não. Alguma opinião?[/quote]

Serve para muitas coisas. E sim, é uma auxilio. Sendo que java tem closures mas não comporta (?Estou supondo?) variáveis de closure ele não é mais que sintax sugar para o programador. Contudo, na realidade, para a jvm é uma outra forma completamente diferente de enxergar as coisas e essa visão lhe permite fazer mais coisas. Um exemplo dado por ai é que com closures é possivel ter catch multiplo

catch (ExcaptionA , ExceptionB e){

}

Ou seja, é um pouco mais que sintax sugar.

Olá

Boa, eu esqueci dos novos Fortran. Mas nos Fortrans antigos, meus programinhas simplesmente tinham um único vetor gigantesco em uma área de COMMON e o tempo todo em todas as sub rotinas, eu ia mapeando a memória para trechos do vetorzão para poder alocar e desalocar memória em uma linguagem sem malloc/free. Mas era obrigado a fazer isto justamente porque Fortran não tinha ponteiros

Com basic eu escrevi meus primeiros programas em um PC em 1983/1984 e acessava diretamente a memória. Os programas foram feitos para ajudar a vender PCs e faziam transferência rápida entre a memória do PC e a memória de vídeo (ou ao disquete). Sem referências teria sido impossível fazer isto. Na época o basic permitia acessar diretamente ao hardware usando a instrução DATA. Java não tem nada nem de longe parecido.

E assembler não tem ponteiros nativos na linguagem. Com assembler a gente já aponta direto na raça para qualquer lugar da memória do computador, cria um endereço base ou uma referência e desta base ou referência somamos os deslocamentos. Só acha que isto é ponteiro quem nunca programou em C.

[]s
Luca

Sergio por esse motivo entendo o seu ponto de vista.
Mas entenda que java trata de alocação de objetos em memória através da referência ,agora como ele referencia esse objeto na memória?,esta é questão.

Em java os ponteiros/referencia são manipuláveis pelo programador?
Não, isso é de responsabilidade da JVM, a maiora das JVM´s utiliza um handle: é um pointer que indica um outro pointer (aqui é a questão que disse acima)

É obvio para não se preocupar com memória é relativo , mas certas responsabilidades do programador foram substituidas por uma JVM(em relação a referencia de objetos na memoria)

"Variáveis de closure"? Acho que você está se referindo a isto aqui:

...
public {int, int => int} x;
...
x = Math#max(int, int);
int p = x.invoke (200, 300); // p recebe 300
...
x = {int r, int s => r + 3 * s };
p = x.invoke (200, 300); // p recebe 1100

Eu posso ter até isto aqui, embora seja um pouco esquisito:

public interface Abc extends { int, int => int }
{
    public void print();
}

E eu teria algo como:

Abc abc = new Pqr(); // Pqr implementa Abc
int p = abc.invoke (20, 30); // aqui estamos usando o método "invoke" que é definido por todos os tipos "closure"
abc.print(); // este é o método normal da interface