Java 1.7 (Dolphin) vai ter ponteiros?

111 respostas
F

Galera essa semana encontrei num site uma noticia que me deixou um pouco preocupado, segue link:

Lá está falando que a nova versão do java irá ter ponteiros, alguém sabe se isso é verdade :?:

Se for, :shock: …

flwsss

111 Respostas

T

Isso é primeiro de abril (postado no dia 17, mas continua sendo primeiro de abril).

Uma coisa que está sendo estudada para entrar no Java 8 (nem no 7, que não vai dar tempo) é "Closures". Lá podemos ter algo parecido com "delegates" do C# ou J#, com a seguinte sintaxe:

class Teste {
    public static void main(String[] args) {
        {int, int => int} funcao; // declarando uma referência para um método que recebe 2 ints e retorna 1 int
        funcao = Math#max(int,int);  // referenciando o método max da classe Math
        int x = funcao.invoke (2, 3); // retorna o máximo de 2 e 3, que é 3
        funcao = Math#min(int,int); // referenciando o método min da classe Math
        x = funcao.invoke (2, 3); // retorna o mínimo de 2 e 3, que é 2
    }
}

Para mais detalhes, vá para http://www.javac.info .

V

thingol:
Isso é primeiro de abril (postado no dia 17, mas continua sendo primeiro de abril).

Uma coisa que está sendo estudada para entrar no Java 8 (nem no 7, que não vai dar tempo) é "Closures". Lá podemos ter algo parecido com "delegates" do C# ou J#, com a seguinte sintaxe:

class Teste {
    public static void main(String[] args) {
        {int, int => int} funcao; // declarando uma referência para um método que recebe 2 ints e retorna 1 int
        funcao = Math#max(int,int);  // referenciando o método max da classe Math
        int x = funcao.invoke (2, 3); // retorna o máximo de 2 e 3, que é 3
        funcao = Math#min(int,int); // referenciando o método min da classe Math
        x = funcao.invoke (2, 3); // retorna o mínimo de 2 e 3, que é 2
    }
}

Para mais detalhes, vá para http://www.javac.info .

Closures acho que é algo legal, mas o problema é que há uma sintaxe horrorosa (too much synthatic sugar) e isso virou modinha que agora eles querem fazer tudo com closures. Ou seja, descobriram que podiam ter um martelo e agora estão pensando que tudo pode ser um prego.

Então, sou a favor de colocá-los na lingagem, mas não da forma como estão fazendo.

V

Se Java tivesse ponteiros eu me suicidava :lol:

ponteiros dão muito poder, mais dão muita dor de cabeça!!!

A

thingol:
Isso é primeiro de abril (postado no dia 17, mas continua sendo primeiro de abril).

Uma coisa que está sendo estudada para entrar no Java 8 (nem no 7, que não vai dar tempo) é "Closures". Lá podemos ter algo parecido com "delegates" do C# ou J#, com a seguinte sintaxe:

class Teste {
    public static void main(String[] args) {
        {int, int => int} funcao; // declarando uma referência para um método que recebe 2 ints e retorna 1 int
        funcao = Math#max(int,int);  // referenciando o método max da classe Math
        int x = funcao.invoke (2, 3); // retorna o máximo de 2 e 3, que é 3
        funcao = Math#min(int,int); // referenciando o método min da classe Math
        x = funcao.invoke (2, 3); // retorna o mínimo de 2 e 3, que é 2
    }
}

Para mais detalhes, vá para http://www.javac.info .

“Closures” já existem em C#, não existe? Isso em Java vai ficar muito interessante.

T

Closures (e mais outras N coisas interessantes) estão disponíveis no C# 3.0 (Visual Studio 2008, requer .NET Framework 3.5 para rodar).

V

Realmente o C# me impressiona cada vez mais, principalmente se for usado para 3d, coisa que eu não consegui fazer com muita facilidade em java :frowning:

S

FilhoDoRei:
Galera essa semana encontrei num site uma noticia que me deixou um pouco preocupado, segue link:

Lá está falando que a nova versão do java irá ter ponteiros, alguém sabe se isso é verdade :?:

Não só não é verdade como é uma descarada mentira.

+1 A sintaxe é realmente horrivel (mas a de propriedades é pior) e essa coisa de forçar o uso em todo o lugar é realmente absurdo.

+1 Suicidar não, mas que Java passaria a ser uma @#@#$@#, sim. Afinal isso é ir contra tudo o que Java representa ( portabilidade, inepencia, segurança , etc). ( Não que eu acredite que algum dia isso aconteça- afinal a sun não é a microsoft - mas seria realmente uma pena se e quando acontecer )

A

Eu não posso dizer por experiência própria, mas vejo meus colegas trabalhando em cima de C# com coisas em 3D e eu tenho que falar: é arrebatador. Em Java eu não vi muita coisa…

T

O C# tem ponteiros, mas seu uso é muito restrito.
A primeira coisa que você tem de fazer é isolar seu código dentro de uma seção “unsafe”, e ainda por cima esse tal código deve ficar em um assembly (.DLL, mais ou menos como se fosse um .jar do Java) que aceita código “unsafe”.
Ou seja, só é usado em casos muito especiais. (É como se esse pedaço do seu código usando ponteiros ficasse com uma “doença contagiosa” e tivesse de ficar isolado.) O jeito de programação padrão do C# é idêntico ao Java, porque, como no Java, não é preciso usar ponteiros em 99,995% do tempo.

P

Eu que postei isso no primeiro de abril.

Volta e meia alguem me pergunta se é sério (ou critica a sun sem olhar a data do post).

V

Dificilmente alguém lê a data dos posts :lol:

F

Foi erro meu, não tinha visto a data do site.

Mas gerou uma certa preocupação, por isso postei sobre o assunto!

Valeu pelas respostas!

flwsss

J

thingol:
O C# tem ponteiros, mas seu uso é muito restrito.
A primeira coisa que você tem de fazer é isolar seu código dentro de uma seção “unsafe”, e ainda por cima esse tal código deve ficar em um assembly (.DLL, mais ou menos como se fosse um .jar do Java) que aceita código “unsafe”.
Ou seja, só é usado em casos muito especiais. (É como se esse pedaço do seu código usando ponteiros ficasse com uma “doença contagiosa” e tivesse de ficar isolado.) O jeito de programação padrão do C# é idêntico ao Java, porque, como no Java, não é preciso usar ponteiros em 99,995% do tempo.

No java tem uma coisa parecida: JNI. Você trabalha direto em C/C++ e utiliza o código nativo através de biblioteca (ddl-windows/so-linux). O uso desse código no java é através de métodos, como se fosse uma chamada a um método Java.

Envim, uma Gambiarra padronizada pelo JCP :smiley:

Já trabalhei com JNI e sinceramente, acho um saco! Mais que muita coisa legal podeser feita com JNI, pode :stuck_out_tongue:

D

Ponteiros em java seria como regredir alguns anos.

Por que vocês acham Closures um recurso tão interessante assim?

Acho que vai ser um recurso que poucos usarão e quando um programador menos informador ver, vai re-escrever o codigo. :stuck_out_tongue:

T

Eu acho que o programador Java não iria reescrever o código se houvesse em Java algo parecido com o LINQ, que facilita horrores a manipulação de dados em memória e em banco de dados.

Uma vez alguém me perguntou aqui como é que se fazia para totalizar e agrupar certas coisas que ele tinha em um array de objetos. A solução com LINQ era bastante simples (acho que dava 2 linhas), e lembrava um pouco SQL. Se você for fazer isso com “for” e outras coisas, vai ocorrer duas coisas:

  • Provavelmente você vai errar umas duas ou três vezes, até fazer isso funcionar direito
  • O código fica monstruoso.
F

thingol:
Eu acho que o programador Java não iria reescrever o código se houvesse em Java algo parecido com o LINQ, que facilita horrores a manipulação de dados em memória e em banco de dados.

Uma vez alguém me perguntou aqui como é que se fazia para totalizar e agrupar certas coisas que ele tinha em um array de objetos. A solução com LINQ era bastante simples (acho que dava 2 linhas), e lembrava um pouco SQL. Se você for fazer isso com “for” e outras coisas, vai ocorrer duas coisas:

  • Provavelmente você vai errar umas duas ou três vezes, até fazer isso funcionar direito
  • O código fica monstruoso.

thingol, o que seria esse tal de LINQ?

flws

A

FilhoDoRei:
thingol:
Eu acho que o programador Java não iria reescrever o código se houvesse em Java algo parecido com o LINQ, que facilita horrores a manipulação de dados em memória e em banco de dados.

Uma vez alguém me perguntou aqui como é que se fazia para totalizar e agrupar certas coisas que ele tinha em um array de objetos. A solução com LINQ era bastante simples (acho que dava 2 linhas), e lembrava um pouco SQL. Se você for fazer isso com “for” e outras coisas, vai ocorrer duas coisas:

  • Provavelmente você vai errar umas duas ou três vezes, até fazer isso funcionar direito
  • O código fica monstruoso.

thingol, o que seria esse tal de LINQ?

flws

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx


http://www.macoratti.net/07/12/net_linq.htm

M

thingol:
Isso é primeiro de abril (postado no dia 17, mas continua sendo primeiro de abril).

Uma coisa que está sendo estudada para entrar no Java 8 (nem no 7, que não vai dar tempo) é "Closures". Lá podemos ter algo parecido com "delegates" do C# ou J#, com a seguinte sintaxe:

class Teste {
    public static void main(String[] args) {
        {int, int => int} funcao; // declarando uma referência para um método que recebe 2 ints e retorna 1 int
        funcao = Math#max(int,int);  // referenciando o método max da classe Math
        int x = funcao.invoke (2, 3); // retorna o máximo de 2 e 3, que é 3
        funcao = Math#min(int,int); // referenciando o método min da classe Math
        x = funcao.invoke (2, 3); // retorna o mínimo de 2 e 3, que é 2
    }
}

Para mais detalhes, vá para http://www.javac.info .

Não sei se entendi direito este papo de closures, mas o que o código acima faz mais do que o código abaixo?

int x = 0;
x = Math.max(2,3);
x = Math.min(2,3);
S

closures ( cercas) singifica básicamente que vc pode passar blocos de codigo como se fossem objetos.
Isso é util porque vc pode enviar código para dentro de outros objetos.

Isso tornas as coisas mais flexiveis e dinamicas. Mas tb mais complexas de ler. Especialmente porque a notação de closures
tente a ser muito abstrata (ou seja, não uma interface nem nada … é algo definido na hora )

T

Vou dar um exemplo bobo do uso de closures.

Normalmente, quando você quer ordenar uma lista de strings por ordem decrescente e sem considerar os acentos ou a diferença entre minúsculas e maiúsculas, você faria isto aqui*:

List<String> lista = new ArrayList<String>();
Collator coll = Collator.getInstance (new Locale ("pt", "BR"));
coll.setStrength (Collator.PRIMARY);
lista.sort (new Comparator<String>() {
    public int compare (String s1, String s2) {
        return -coll.compare (s1, s2);
    }
}

Em vez dessas incômodas linhas (new Comparator … etc.), se tivéssemos Closures e se a Java Collections Framework fosse atualizada para suportar closures**, teríamos:

lista.sort ({s1, s2 => -coll.compare (s1, s2)});

  • OK, você poderia dizer que eu poderia usar "lista.sort (Collections.reverseOrder (coll))", mas só quero mostrar um exemplo.
    ** Neste caso deveríamos ter um método Collections.sort declarado como:
public static <T> void sort(List<T> list, Comparator<? super T> c); // declaração no Java 6.0
public static <T> void sort(List<T> list, {? super T, ? super T => int} c); // versão alternativa com closures
R

:shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:
Uma das frases mais estranhas dos ultimos tempos… Superação!

V

thingol:

** Neste caso deveríamos ter um método Collections.sort declarado como:

public static <T> void sort(List<T> list, Comparator<? super T> c); // declaração no Java 6.0 public static <T> void sort(List<T> list, {? super T, ? super T => int} c); // versão alternativa com closures

Acho que o closure desse método sort ainda não serve, pois o capture do primeiro ? seria diferente do capture do segundo ?.

Não manjo de closures, mas se eu não estiver ofendendo a sintaxe (nem do closure e nem do generic), isso acho que resolveria:

public static <T, E super T> void sort(List<T> list, {E, E => int} c); // versão alternativa com closures
V

A variável coll teria que ter o modificador final, ou então a annotation @Shared. Correto?

S

:shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:
Uma das frases mais estranhas dos ultimos tempos… Superação!

Cogitei várias horas sobre se deveria responder ao seu espanto.
Não sei se não entendeu a frase ou se não entendeu o sarcasmo.

Lendo o texto é óbvio que é uma mentira.É tão obvio que é descarado (ou seja, não é escondido)
Passagem de primitivos por referencia ? Strings como ponteiros para arrays de char ? Ora, é absurdo.
Prova por redução ao absurdo, já ouviu falar ? Pois. É por isso que é uma mentira descarada. Ou seja,
não é verdade e é óbvio que não é verdade. O autor fez de propósito para ser óbvio.
Isso é a explicação da frase. O sarcasmo deixo por conta…

V

:shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:
Uma das frases mais estranhas dos ultimos tempos… Superação!

Cogitei várias horas sobre se deveria responder ao seu espanto.
Não sei se não entendeu a frase ou se não entendeu o sarcasmo.

Lendo o texto é óbvio que é uma mentira.É tão obvio que é descarado (ou seja, não é escondido)
Passagem de primitivos por referencia ? Strings como ponteiros para arrays de char ? Ora, é absurdo.
Prova por redução ao absurdo, já ouviu falar ? Pois. É por isso que é uma mentira descarada. Ou seja,
não é verdade e é óbvio que não é verdade. O autor fez de propósito para ser óbvio.
Isso é a explicação da frase. O sarcasmo deixo por conta…

Aqui ele realmente apelou no grau da mentira.

T

victorwss:
thingol:

lista.sort ({s1, s2 => -coll.compare (s1, s2)});


A variável coll teria que ter o modificador final, ou então a annotation @Shared. Correto?

Realmente eu não mostrei os detalhes “sangrentos” da coisa. (Não testei o código com o protótipo do Neal Gafter). Mas é isso mesmo (você precisa pôr a annotation @Shared ou então usar “final” já que uma closure (nesse caso) é (entre outras coisas) uma sintaxe alternativa para uma anonymous inner class.

R

:shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:
Uma das frases mais estranhas dos ultimos tempos… Superação!

Cogitei várias horas sobre se deveria responder ao seu espanto.
Não sei se não entendeu a frase ou se não entendeu o sarcasmo.

Lendo o texto é óbvio que é uma mentira.É tão obvio que é descarado (ou seja, não é escondido)
Passagem de primitivos por referencia ? Strings como ponteiros para arrays de char ? Ora, é absurdo.
Prova por redução ao absurdo, já ouviu falar ? Pois. É por isso que é uma mentira descarada. Ou seja,
não é verdade e é óbvio que não é verdade. O autor fez de propósito para ser óbvio.
Isso é a explicação da frase. O sarcasmo deixo por conta…

Eu até tinha escrito alguma coisa para uma replica… mas diante de tudo o que eu vejo vc escrevendo, nada me surpreendeu… prefiro me conter…
Mais uma superação sua… Guarde suas provas matemáticas para um lugar onde vc possa aplica-las na verdade…
Trata-se apenas de um “1/4”… somente isso…
Ah! Uma dica para vc… Leia a data antes dos textos…

D

Closure não seria um nome bonito para ponteiro de função/método então?

Isso faz com que indiretamente tenhamos ponteiros. Ou não.

V

dudaskank:
Closure não seria um nome bonito para ponteiro de função/método então?

Isso faz com que indiretamente tenhamos ponteiros. Ou não.

Java SEMPRE teve ponteiros. Referências para objetos são ponteiros para alguma coisa na memória que contém os bytes que representam esse objeto.
Sim, closures são uma forma de se criar ponteiros para métodos.

P

victorwss:

Java SEMPRE teve ponteiros. Referências para objetos são ponteiros para alguma coisa na memória que contém os bytes que representam esse objeto.
Sim, closures são uma forma de se criar ponteiros para métodos.

Não. Referência é algo completamente diferente de ponteiro, leia este tópico:

http://www.guj.com.br/posts/list/61217.java

A

Eu gosto de assimilar C++ com Java (por mais que eu acho que é errado).

Em C++:

Grafo *grafo = new Grafo(10, 20);

Em Java:

Grafo grafo = new Grafo(10, 20);

Os fins são os mesmos, mas não podemos falar que Java tem ponteiros… nem perto disso… ele pode ter uma função parecida (que serve pra referenciar os objetos na Heap e bla bla bla), mas não lida com ponteiros de forma alguma.

V

pcalcado:
victorwss:

Java SEMPRE teve ponteiros. Referências para objetos são ponteiros para alguma coisa na memória que contém os bytes que representam esse objeto.
Sim, closures são uma forma de se criar ponteiros para métodos.

Não. Referência é algo completamente diferente de ponteiro, leia este tópico:

http://www.guj.com.br/posts/list/61217.java

Na verdade acho que este tópico foi inconclusivo. De qualquer forma, como o ViniGodoy disse no último post:

Ou seja, não dá para dizer que java não tem ponteiros, eles apenas não são explícitos. Mas acho que isso é algo para outro tópico…

P

victorwss:

Ou seja, não dá para dizer que java não tem ponteiros, eles apenas não são explícitos. Mas acho que isso é algo para outro tópico…

Bom, se voc6e acha que James Gosling não dá a palavra final sobre a linguagem que ele criou…

Luca:

[…]


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
[…]
Luca

V

ok, so let’s go to still yet another more java’s pointer or not flamewar:

Ele estava se referindo ao comportamento em relação a forma como ele é modelado em crítica ao .Net suportar C e C++. Ele se refere que um Image é modelado por um Image e não por um byte*. Ou seja, a crítica é em relação a modelagem comum em C e C++ onde você tem coisas como “Esse ponteiro é a imagem”, sem que haja OO, encapsulamento, abstração ou qualquer coisa assim.

Aqui ele se refere a ponteiros no sentido explícito, que sejam manipulados diretamente.

S

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

P

Errr… não. Antes de mais nada existe OO em C++, pode existir em C utilizando as formas de programação certas e encapsulamento não depende de objetos. A crítica é quando à tipagem fraca, na verdade, mas o que importa é que ele usa como argumento o fato de que uma referência não é um ponteiro.

victorwss:

Aqui ele se refere a ponteiros no sentido explícito, que sejam manipulados diretamente.

“Ponteiro implícito” é um termo seu ou você tem alguma referência, explicando o que você quer dizer? Como o quote não cita explícito ou implícito acho que concordamos que para o texto ponteiros é uma coisa só e eles não existem em Java, correto?

Uma referência é algo diferente de ponteiro, C#, C++, C e Pascal, linguagens com ponteiro, possuem também referências e é clara a distinção entre eles. Chamar uma referência de ponteiro implícito para mim é como dizer que C tem “garbage collection explícita”, já que quem faz o GC é você.

Quase todas as linguagens de programação modernas possuem referências e quase nenhuma tem ponteiros. São coisas semânticamente diferente (aponta-para-o-objeto vs aponta-para-a-memoria) e não há porque tentar fazê-los o mesmo.

L

Referencias e ponteiros são conceitos diferentes. Uma forma comum de implementar referências é via ponteiros, mas isso é, como pode-se esperar, um detalhe. As primeiras JVMs usavam tabelas de objetos e referencias eram implementadas como índices para essas tabelas.

L

Olá

Por favor mostre em apenas uma instrução como se representa um ponteiro com Java

Aceito exemplos também em outras linguagens que também possuem referências tais como Fortran e basic

[]s
Luca (pasmo, estupefato, completamente desorientado pela descoberta 10 anos depois de que Java tem ponteiros e até hoje eu nunca soube como representá-los)

S

Luca:
Olá

Por favor mostre em apenas uma instrução como se representa um ponteiro com Java

Aceito exemplos também em outras linguagens que também possuem referências tais como Fortran e basic

Representar ponteiros ? Vc quer dizer variáveis que contém endereços ?

Integer a

Ponteiros em várias linguagens

http://cslibrary.stanford.edu/104/

L

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

P

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.

S

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.

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.

S

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 ?

K

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

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.

P

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.

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…

T

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.
R

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 ?

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”?

S

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.


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”?

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.

L

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

L

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

S

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 ?

K

pcalcado:

Ponteiro é uma coisa, referência (remota ou local) é outra.

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 ?

S

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”.

P

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.

D

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:

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

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?

S

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…


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?

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.

L

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

R

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)

T

"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
V

setAppelationMode(true);
setForcacaoDeBarraLevel(ForcandoABarra.EXTREME);

Tinham pedido alguns exemplos de obter ponteiro inválido em java e de fazer aritmética de ponteiros. Pois bem, lá vai.

Agradecimentos ao meu amigo Alcides Liberali.

import sun.misc.Unsafe;
import java.lang.reflect.Field;

/**
 * @author Victor Williams Stafusa da Silva
 * O ministério da saúde adverte: Esta classe causa câncer e
 * severos outros danos a saúde. Não existem níveis seguros
 * para o consumo das substâncias aqui presentes.
 *
 * Agradecimento: Alcides Liberali
 */
public class ApelacaoSemNocao {
    public static void main(String[] args) throws Exception {

        // Total appelation here!
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        Unsafe unsafe = (Unsafe) f.get(null);

        Object h4ck3r = new Object();

        // Colocando um belo lixo de memória aqui.
        unsafe.putLong(h4ck3r, 0, 0x7777777777777777L);

        // Ops, obtém um ponteiro inválido aqui!
        Class<?> lollollol1one = h4ck3r.getClass();

        // CRASH!
        lollollol1one.toString();
    }
}
import sun.misc.Unsafe;
import java.lang.reflect.Field;

/**
 * @author Victor Williams Stafusa da Silva
 * PERIGO: Crianças, não façam isso em casa.
 * Nunca, nunca, jamais, never, em hipótese alguma use isso em um ambiente de produção.
 * O uso deste programa é proibido para menores de 256 anos de idade.
 *
 * Agradecimento: Alcides Liberali
 */
public class AritmeticaDePonteiros {

    private static class PointerGambi1 {
        public long valor;
    }

    private static class PointerGambi2 {
        public Object valor;
    }

    private static final String[] array = {
        "cenoura",
        "batata",
        "uva",
        "pizza",
        "maionese"
    };

    public static void main(String[] args) throws Exception {

        // Total appelation here!
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        Unsafe unsafe = (Unsafe) f.get(null);

        // Obtém uns valores úteis.
        long ofg1 = unsafe.objectFieldOffset(PointerGambi1.class.getField("valor"));
        long ofg2 = unsafe.objectFieldOffset(PointerGambi2.class.getField("valor"));
        int offset = unsafe.arrayBaseOffset(String[].class);
        int scale = unsafe.arrayIndexScale(String[].class);

        PointerGambi1 g1 = new PointerGambi1();
        PointerGambi2 g2 = new PointerGambi2();
        unsafe.putObject(g1, ofg1, array); // Converte ponteiro em long (ou seria referência em long?)
        int t = unsafe.getInt(array, 8L); // Ou seja, t = array.length, que é o mesmo que *(&array + 8).

        // Itera o array.
        for (int a = 0; a < t; a++) {
            // Calcula a posição do elemento via aritmética de ponteiros (ou seria aritmética de referências?)
            long endereco;
            if (scale == 4) { // Para processadores de 32 bits (aqui a portabilidade foi pro saco!)
                endereco = unsafe.getInt(array, offset + 4 * a);
            } else if (scale == 8) { // Para processadores de 64 bits.
                endereco = unsafe.getLong(array, offset + 8 * a); 
            } else {
                throw new Exception("Escala não suportada: " + scale);
            }

            // Usa o g2 como um iterador.
            unsafe.putLong(g2, ofg2, endereco); // Converte long em ponteiro (ou talvez long em referência?)

            // Mostra o elemento.
            System.out.println(g2.valor);
        }
    }
}
S

thingol:
"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

sim, era isso que me referia. x é uma “variável de closure”. A questão é se isso é uma variável de objeto, ou não.
Olhando assim parece mais um método do que um Objecto. Sim, o método é um objeto tb… é só isso ? Possibilitar Método-Objecto ?
O seu exemplo de x= math#max() deixa isso bem claro. ( isso é official ?)

quando vc diz “pode” quer dizer “está proposto que o java tenha isto” ou “em tese , teoricamente, poderia fazer isto” ?

D

Obrigado ao sergiotaborda e ao thingol pelas respostas sobre o assunto, com certeza preciso ler muito mais ainda.

Alguém tem por aí o exemplo com catch múltiplo para eu observar?

Ah, victorwss… que monstro é isso? Hahahaha. Agora acho que podemos afirmar que java tem ponteiros?

K

ramilani12:
sergiotaborda:


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)

Não vi o Sérgio falando nada diferente disso, apenas deu uma explicação conceitual sobre ter ponteiros e poder ou não manipulá-los.

Compreensão de texto, está faltando para muitos …

T

sergiotaborda:
thingol:
"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

sim, era isso que me referia. x é uma "variável de closure". A questão é se isso é uma variável de objeto, ou não.
Olhando assim parece mais um método do que um Objecto. Sim, o método é um objeto tb… é só isso ? Possibilitar Método-Objecto ?
O seu exemplo de x= math#max() deixa isso bem claro. ( isso é official ?)

quando vc diz "pode" quer dizer "está proposto que o java tenha isto" ou "em tese , teoricamente, poderia fazer isto" ?

a) Closures em C# e na proposta BGGA para o Java são implementados usando classes anônimas. Portanto essas variáveis que contém closures, na verdade são de um tipo especial que é uma classe anônima. Ou seja, como todas as variáveis (exceto as que são de tipos primitivos), elas irão referir-se a objetos.
b) Essa declaração maluca de interface que estende uma closure está também na proposta BGGA, mas acho que ninguém em são consciência vá usar uma coisa dessas.
c) Quando alguém declara isto aqui:

{int, int => int} x = Math#max(int,int);

está na verdade fazendo algo parecido com isto aqui:

Closure2<Integer,Integer,Integer> x = new Closure2<Integer,Integer,Integer>() {
    public Integer invoke (Integer a, Integer b) {
        return Math.max (a, b);
    }
}

É claro que em vez de termos esse tipo genérico “Closure2” temos algo um pouco mais complexo, mas isso é um detalhe de implementação que pode ser alterado do protótipo da proposta BGGA para o produto final, caso isso venha a ser adotado no Java 7 ou 8.

T

O catch múltiplo, embora não seja algo que esteja definido na proposta BGGA (http://www.javac.info ) , é algo que está programado no protótipo (também pode ser baixado de http://www.javac.info ). É algo bem simples:

try {
    ....
} catch (FileNotFoundException | ObjectStreamException ex) {
   ex.printStackTrace();
}

Que é uma abreviatura bem cômoda para:

try {
    ....
} catch (FileNotFoundException ex) {
   ex.printStackTrace();
} catch (ObjectStreamException ex) {
   ex.printStackTrace();
}

Usando o velho e bom princípio “DRY” (Don’t Repeat Yourself". )

É óbvio que quando listamos 2 ou mais exceções, só podemos chamar os métodos que são comuns a elas (não sei se o Gafter impõe que os métodos estejam na superclasse, ou se eles simplesmente podem ter o mesmo nome).

P

Kenobi:
pcalcado:

Ponteiro é uma coisa, referência (remota ou local) é outra.

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 ?

Imagine que a memória é um grande array. Se sua variável guarda um índice para o array ela é um ponteiro -e você a desreferencia, usando algo como Obj a = memoria[ponteiro];, para pegar o valor- se ela guarda uma referência direta para o objeto armazenado no array ela é uma referência.

Em C++ a diferença é gritante. Dê uma olhada no link que passaram antes.

victorwss:
setAppelationMode(true);
setForcacaoDeBarraLevel(ForcandoABarra.EXTREME);

Tinham pedido alguns exemplos de obter ponteiro inválido em java e de fazer aritmética de ponteiros. Pois bem, lá vai.

Agradecimentos ao meu amigo Alcides Liberali.

Pela sua linha de raciocínio eu posso dizer que Java “possui” Ruby já que existe uma biblioteca que permite executar Ruby.

V

pcalcado:
victorwss:
setAppelationMode(true);
setForcacaoDeBarraLevel(ForcandoABarra.EXTREME);

Tinham pedido alguns exemplos de obter ponteiro inválido em java e de fazer aritmética de ponteiros. Pois bem, lá vai.

Agradecimentos ao meu amigo Alcides Liberali.

Pela sua linha de raciocínio eu posso dizer que Java “possui” Ruby já que existe uma biblioteca que permite executar Ruby.

Hã? O que ruby tem a ver com a história?
O negócio é que aqueles programas não fariam o que fazem se as referências no java não fossem implementadas como ponteiros.

P

victorwss:

Hã? O que ruby tem a ver com a história?
O negócio é que aqueles programas não fariam o que fazem se as referências no java não fossem implementadas como ponteiros.

O que você mostrou foi uma biblioteca que não faz parte da linguagem Java (faz da implementaçãod a JVM da Sun, provavelmente). JRuby é exatamente isso, uma biblioteca que não faz parte de java mas faz java suportar Ruby.

Acho que ninguém aqui acha que as referências não são implementadas por ponteiros, até porque a JVM é em C++. Claro que isso não faz delas ponteiros.

L

Olá

O Fortran sempre teve referências muito antes de aparecer o termo ponteiro na área de TI. O conceito de ponteiro surgiu com o C, nenhuma linguagem mainstream tinha isto antes. E o C só deslanchou mesmo como linguagem muito usada depois dos micros. Aqui no Brasil onde os mainframes IBM dominavam amplamente o mercado, antes dos micros, o C só era usado nas universidades.

Este tópico tenta provar que ter um cachorro morto enterrado no jardim é o maior barato. O cara tem mas não pode fazer nada com ele.

Eu vivi no tempo em que o Java surgiu e lembro claramente de todo o marketing feito em cima do Java justamente por não haver ponteiros na linguagem para o programador usar. Nunca vi em livro nenhum de Java básico alguma linha ensinando como usar ponteiro em Java. E nunca vi em nenhum livro de programação o termo referência sendo confundido com o termo ponteiro como querem demonstrar neste tópico.

E nunca vi ninguém se preocupar como a linguagem era implementada. Como disse antes, o compilador Fortran sempre teve tabelas de símbolos implementadas usando estruturas de dados mais poderosas do que a linguagem disponibilizava para o programador e nunca vi nenhum programador dizer que a linguagem Fortran tinha tabelas de símbolos.

[]s
Luca

L

seria uma boa se java deixasse vc usar ponteiros… mas opcionalmente que nem o C# seria algo otimo…

V

Não fala besteira, manipular ponteiros diretamente é algo inerentemente inseguro. Embora sem dúvida ponteiros dêem uma ampla flexibilidade e um controle quase total da CPU, eles também são a porta de entrada para que muita merda aconteça. Sim, a LINGUAGEM java não tem ponteiros, mas isso não significa que eles não existam no AMBIENTE java.

E se por algum motivo, você REALMENTE precisa de ponteiros, acho que o JNI seria a melhor saída.

pcalcado: Sim, sun.misc.Unsafe é algo bem específico da JVM da Sun e não faz parte do conjunto de classes públicas do java e nem nunca deverá fazer. O nome da classe já diz o que ela é.

Olhando um pouco para o passado, vejo que ponteiros tendem a ser traumatizantes para boa parte dos programadores C e C++, em especial aqueles que querem migrar. Então em uma linguagem que não os tem (embora ainda estejam escondidos lá dentro), seria uma boa idéia jogar o marketing nesta direção.

A

O problema é pegar alguém que não saiba lidar com ponteiros fazendo uma coisa dessas… inclusive um experiente sempre deixa passar algum memory leak.

T

O problema de você deixar um usuário da linguagem usar ponteiros é que você acaba tendo de diferenciar entre uma região de memória onde o garbage collection deve ser bloqueado (memória fixa) e outra onde o garbage collection pode prosseguir normalmente.
É que ponteiros do C/C++ normalmente apontam para memória “fixa”.
Isso acarreta vários problemas que são difíceis de resolver sem deixar seu programa MAIS LENTO.

Você que usa ponteiros em C# achando que as coisas vão ficar mais rápidas vai se surpreender vendo que elas ficam é mais lentas, devido a esses problemas esquisitos.

(Aham, em Real-Time JAVA existe o conceito de memória fixa, não sujeita a garbage collection, mas a manipulação dessa memória não é arbitrária como se fosse com ponteiros, e tal memória deve ser alocada com cuidado. )

S

Luca:
Olá

Eu vivi no tempo em que o Java surgiu e lembro claramente de todo o marketing feito em cima do Java justamente por não haver ponteiros na linguagem para o programador usar. Nunca vi em livro nenhum de Java básico alguma linha ensinando como usar ponteiro em Java. E nunca vi em nenhum livro de programação o termo referência sendo confundido com o termo ponteiro como querem demonstrar neste tópico.

E nunca vi ninguém se preocupar como a linguagem era implementada. Como disse antes, o compilador Fortran sempre teve tabelas de símbolos implementadas usando estruturas de dados mais poderosas do que a linguagem disponibilizava para o programador e nunca vi nenhum programador dizer que a linguagem Fortran tinha tabelas de símbolos.

Mas é exactamente esse o problema. Vc está distorcendo o marketing.
O que o marketing do java afirma é que ele não tem “Tipo de Dado Ponteiro” (pointer data type) que é diferente de “ponteiro” (pointer). E isso é verdade. Não existe , em java, e nem em nenhuma outra linguagem de alto nivel o conceito de uma variável que contém outra variável. Tudo bem.
A distorção é que vc supoe que isso significa que não existem ponteiros (variável de endereço) e isso é que é falso porque vc está tentando inverter uma implicação como se fosse uma equivalencia.

pointer data type => pointer

Nem no C é uma equivalencia. Se fosse não seriam necessárias referencias e ponteiros juntos.

O ponto é que é evidente que Java usa ponteiros, não apenas de forma enterrada, mas de forma explicita. Se mais nenhum exemplo o convence pelo menos o == deveria. A menos que consiga explicar o que ele faz sem usar o conceito de ponteiro.
O conceito de ponteiro é muito simples: Variável que contém um endereço. Se esse endereço é na memoria fisica, na memoria virtual, em uma tabela de alocação , não importa.
Esqueça C um momento e a teoria compada das linguagens. Foque apenas no java.

Integer a = new Integer(1);
Integer b = new Integer(2);

if (a==b){
  a=b; 
}
a=null

1)O que significa “Integer a” ?
2)O que significa a==b ?
3)O que significa a=b ?
4)O que significa a=null ?

Tente explicar estas operações sem utilizar o conceito de ponteiro (do C) nem o de referencia ( do C nem do Java)
Vai ver que é muito simples, mas precisa do conceito de “apontar” em algum lugar da sua explicação. Não é mesmo ?

Este é um exercicio simples se quer entender porque o Java tem ponteiros.
Se não quiser esqueça… quem entende, entende e para quem não entende … est lasse.

L

Olá

Falei no passado e disto tenho certeza que no lançamento do Java isto era apregoado com vantagem.

OK, OK, você venceu. Se você quer, referência passa a ser a mesma coisa que ponteiro, COBOL, FORTRAN 66, ALGOL todos tem ponteiros e não se fala mais nisto. Só não coloque como minhas coisas que eu não escrevi.

[]s
Luca

L

besteira restingir algo so pq algum inexperiente possa fazer merda…
se vc não tem certeza doque esta fazendo simplismente não faça desta forma… simples…
seria legal ter a liberdade de manipular ponteiros… mas o problema é que quem faz este tipo de coisa e a jvm para delegar isto ao programador estara passando por cima da jvm…
mas ponteiros são legais… basta saber manipular de forma correta…

V

luistiagos:
besteira restingir algo so pq algum inexperiente possa fazer merda…
se vc não tem certeza doque esta fazendo simplismente não faça desta forma… simples…
seria legal ter a liberdade de manipular ponteiros… mas o problema é que quem faz este tipo de coisa e a jvm para delegar isto ao programador estara passando por cima da jvm…
mas ponteiros são legais… basta saber manipular de forma correta…

O problema é que o uso de ponteiros compromete a segurança do java, compromete a robustez, compromete a portabilidade e compromete mais um monte de coisas. Obviamente, que para usar ponteiros corretamente tem que ser experto, e decerto, se forem usados corretamente nenhum destes problemas aparece. O porém é que usá-los errado é muito mais fácil do que usá-los certo.

Obviamente, quem for fazer merda, faz merda com qualquer coisa. Mas merda em ponteiro fede mais que qualquer outra merda. Então eles foram evitados até a morte.

Se você realmente precisa, use JNI, ou se quiser pode até apelar para o Unsafe (e fugir da inquisição depois).

T

A disponibilidade de ponteiros compromete o desempenho (porque você não pode usar um super-ultra-rápido algoritmo de “garbage collection” mas um algoritmo mais vagabundo, que permita ter regiões de memória fixa), e compromete sua sanidade mental - imagine como é tentar corrigir problemas de ponteiros - eu que já programei (e programo) muito em C e C++ é que digo.

L

Thingol, existem garbage collectors que funcionam com ponteiros e conseguem mover objetos mesmo na presença de interior pointer. De fato, pointeiros não impedem algorítmos avançados de GC, o que impede é tracing conservativo.

G

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.

Sendo matematico, discordo bastante aqui… existem diversos tipos de operacoes sem ser aritmeticas… podendo ser aplicadas em numeros, corpos, matrizes etc… inclusive diversas operacoes que estao totalmente ligadas com conceitos de logica.

Sendo programador de java, Date sucks e nao deveria existir… mas a caca foi feita muito tempo atras (e usada aos montes… inclusive eu mesmo antigamente)

Abraco

M

:wink: No seu conceito de lógica

:idea: Diagrama de Classes podem ser usados em projetos com herança múltipla :?:

S

Guilherme Silveira:
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.

Sendo matematico, discordo bastante aqui… existem diversos tipos de operacoes sem ser aritmeticas… podendo ser aplicadas em numeros, corpos, matrizes etc… inclusive diversas operacoes que estao totalmente ligadas com conceitos de logica.

O ponto é o inverso: sem numeros , corpos, matrizes, não ha operações. Com numeros, corpos, matrizes, podem haver operações ou não.
Vc discorda, matemáticamente, disto ?

L

sergiotaborda:
O ponto é o inverso: sem numeros , corpos, matrizes, não ha operações. Com numeros, corpos, matrizes, podem haver operações ou não.
Vc discorda, matemáticamente, disto ?

Você, para variar, tá falando asneira. Um corpo, por exemplo, é definido em função de um conjunto, o elemento neutro (o zero) e operações + e .

Forma e função se complementam e na maioria dos casos uma pode ser reescrita em função da outra. Basta estudar defunctionalization sobre lambda calculus que fica clara a relação.

Sérgio, vai usar seus ponteiros Java e para de escrever porcaria aqui.

R

kenobi:

Não vi o Sérgio falando nada diferente disso, apenas deu uma explicação conceitual sobre ter ponteiros e poder ou não manipulá-los.
Compreensão de texto, está faltando para muitos …

Não é falta de compreensão de texto e sim a confusao entre referenciaXponteiros.

R

Sinceramente nao entendi a sua pergunta.

Mas tentando entender pode ser utilizado sim, lembrando que UML é independentede linguagem de programação.

V

Marcio Duran:
Guilherme Silveira:

Sendo matematico, discordo bastante aqui… existem diversos tipos de operacoes sem ser aritmeticas… podendo ser aplicadas em numeros, corpos, matrizes etc… inclusive diversas operacoes que estao totalmente ligadas com conceitos de logica.

:wink: No seu conceito de lógica

:idea: Diagrama de Classes podem ser usados em projetos com herança múltipla :?:

:!: Podem.

:arrow: O problema é que você não vai conseguir implementá-los em java!

:idea: Você pode usar herança de interfaces.

E

ramilani12:
Marcio Duran:

Diagrama de Classes podem ser usados em projetos com herança múltipla

Sinceramente nao entendi a sua pergunta.

Mas tentando entender pode ser utilizado sim, lembrando que UML é independentede linguagem de programação.

Não entender o Duran é algo normal. Aliás, a existência do Márcio Duran é um golpe seríssimo na hipótese subjacente ao teste de turing. Por exemplo, M-x doctor no emacs é muito mais inteligível que o Duran, então posso concluir que o emacs pensa?

S

louds:
sergiotaborda:
O ponto é o inverso: sem numeros , corpos, matrizes, não ha operações. Com numeros, corpos, matrizes, podem haver operações ou não.
Vc discorda, matemáticamente, disto ?

Você, para variar, tá falando asneira. Um corpo, por exemplo, é definido em função de um conjunto, o elemento neutro (o zero) e operações + e .

Essas coisas definem o corpo, não as operaçãos entre corpos. dah!
Operação sobre elementos de X não é operação sobre X.
(operação sobre X é diferente de operação em X)

A operação + e . são definidas sobre os elementos de X e X, com essas operações é um Y.

(A operação + e . são definidas sobre os elementos dos Reais, e os Reais são um Grupo , um Anel e um Corpo

A operação + e . definida em |R não é aplicável para operarar entre Corpos. ( o dominio e contra-dominio são elementos de um corpo apenas e não corpos )
Arimética sobre corpos seriam operações entre , por exemplo, |R como um todo e |N como um todo.

Arimética, por outro lado, inclui apenas 4 operações ( + , - , x , /) conjugação dos complexos, por exemplo, não é arimética.

O argumento se mantêm. Para ter operações sobre um corpo ( não sobre os elementos do corpo) o corpo tem que existir em primeiro lugar. Mas se existe, isso não implica que existam operações ariméticas com corpos.
(O que seria somar dois corpos ?)

Calculo lambda é um entre muitos tipos. Vc está generalizando o todo pela parte. Isso é uma falácia logica.
É obvio que, portanto, o seu argumento é falso.


Sérgio, vai usar seus ponteiros Java e para de escrever porcaria aqui.

Eu paro de escrever aqui quando pararem de escrever argumentos falaciosos.
O que é fácil. Basta não escrever coisa alguma.

E

Luca:
Olá

Este tópico tenta provar que ter um cachorro morto enterrado no jardim é o maior barato. O cara tem mas não pode fazer nada com ele.

[]s
Luca

Luca,

Tecnicamente, é possível usar um cachorro morto enterrado no jardim para impressionar meninas góticas tendo em vista objetivos reprodutivos e para-reprodutivos. Embora eu nunca tenha testado isso, não vejo porque não funcionaria.

E

O conhecimento científico tem a generalização como um de seus pilares. Sem generalização não há ciência. Nem toda generalização é falaciosa.
É meio bizarro acusar alguém de uma falácia cometendo outra.

P

Soberba

P

Humildade

E

pinto:
Humildade

Só o amor constrói para a eternidade,.
Cuidado em quem você pisa ao subir porque você pode encontrar a mesma pessoal na descida
A Inveja é uma merda (um adesivo normalmente encontrado em corcel II 79)

Duh! Viu? também sei ser do bem e contribuir para a paz universal.

E aí? o que esses seus dois posts acrescentam além de nos informar sobre suas superiores e excelsas qualidades morais as quais os habilitam a desperdiçar banda e espaço em disco para nos dar uma lição de moral no meio da thread?

M

ramilani12:

Mas tentando entender pode ser utilizado sim, lembrando que UML é independentede linguagem de programação.

  1. A Unified Modeling Language (É uma notação).Não é nem modelo de processo ou metodologia.

:arrow: Exemplo

:idea: Tanto a classe Vraptor quanto classe Dolphin estendem a classe ObjetoLouds, e tanto Vraptor quanto Dolphin herdam um método de ObjetoLouds.Se a classe Scorpion estender tanto Vraptor quanto Dolphin,e tanto Vraptor quanto Dolphin tiverem subscrito o método de ObjetoLouds, a classe Scorpion [color=blue]terá ,herdado duas implementações diferentes do mesmo método[/color].Desenhada como um diagrama de classe, a forma das quatro classes se parecer com um diamente.

A visão de lógica pode variar em seus aspectos, que foram afirmados pelo Guilherme, no que ele simplesmente argumentou.

P

eliziario:
pinto:
Humildade

Só o amor constrói para a eternidade,.
Cuidado em quem você pisa ao subir porque você pode encontrar a mesma pessoal na descida
A Inveja é uma merda (um adesivo normalmente encontrado em corcel II 79)

Duh! Viu? também sei ser do bem e contribuir para a paz universal.

E aí? o que esses seus dois posts acrescentam além de nos informar sobre suas superiores e excelsas qualidades morais as quais os habilitam a desperdiçar banda e espaço em disco para nos dar uma lição de moral no meio da thread?

Sua manifestação de raiva consumiu bem mais banda e disco do que as minhas mensagens.
Mas tudo bem, se isto lhe fez bem, então os recursos foram bem utilizados.

Porém, tamanha ira e descontrole emocional não combinam com a imagem do Mestre Yoda, que você escolheu para o seu avatar.
Como fã de Star Wars, eu protesto!

Paz

E

pinto:

Porém, tamanha ira e descontrole emocional não combinam com a imagem do Mestre Yoda, que você escolheu para o seu avatar.
Como fã de Star Wars, eu protesto!

Paz

Você não contou com a hipótese de que eu poderia estar usando o avatar do mestre yoda justamente em uma tentativa de desmoralizá-lo.

Mas blz, eu realmente estava puto com uma bizonhice que envolve anemic domain models e certos “professores” que propagam uma bizarrice que eles chamam de DLO (Data Logic Objects), mas que deveria ser chamado de PUOJ (Pascal Unit on Java)

S

eliziario:
sergiotaborda:

Calculo lambda é um entre muitos tipos. Vc está generalizando o todo pela parte. Isso é uma falácia logica.
É obvio que, portanto, o seu argumento é falso.

O conhecimento científico tem a generalização como um de seus pilares. Sem generalização não há ciência. Nem toda generalização é falaciosa.
É meio bizarro acusar alguém de uma falácia cometendo outra.

O conhecimento cientifico não tem a generalização como um dos seus pilares. O método cientifico é o pilar. A experimentação é o pilar. A lógica é o pilar. Se nem toda a generalização é falaciosa significa que algumas são. A do exemplo é uma que é. O meu argumento não é falso porque o seu não é verdadeiro. :wink:

:lol: :lol: :lol: :lol:

Discutir o sexo dos anjos tem graça da primeira vez… depois aborrece.

M

:idea: Pitágoras foi filósofo, a matemática foi um instrumento, de uma de suas investigações.

R

Caraca!!! Começou com “o dia da mentira” e Java, passamos por Fortran, Ruby, Closure, JRuby, Anemic Domains, Matematica, Folosofia e já estamos falando de Pitágoras!

F

Acho que é para comemorar as 500 mil mensagens no fórum.

Mas até que tá interresante…

G

@sergiotaborda: continuamos tendo que numeros podem existir e ser usados (operacoes diversas sem ser aritmeticas) sem operacoes aritmeticas certo?

@duran: apesar da situacao ser ficticia (nenhum de nos teria feito a heranca multipla neh, nem em outra linguagem ne? hahaha)… o que quis dizer eh que operadores como NOT, OR, AND nao sao aritmeticos e estao ligados com logica. estou correto?

abracos

S

Guilherme Silveira:
@sergiotaborda: continuamos tendo que numeros podem existir e ser usados (operacoes diversas sem ser aritmeticas) sem operacoes aritmeticas certo?

Sim. Por exemplo a operação sign() que devolve 1 se o numero é maior que 0, 0 se é zero e -1 se é menor.

M

:idea: Ok.afirma isso pela Física então, ao invés de se acobertar na sombra da Matématica.

:stuck_out_tongue: Enquanto a computação binária clássica opera com chaveamentos excludentes, tipo de sim ou não, ou um ou zero, a quântica usa agentes que podem estar nos dois estados ao mesmo tempo, uma das mais intrigantes propriedades da física quântica. É como se você estivesse tentando sair de um labirinto e surgisse uma bifurcação à frente. No computador binário você só poderia entrar em uma porta de cada vez.

:thumbup: “Fique avontade em mais uma situacao ser ficticia, se assim considerar também”

:wink: Abraçoss

P

Marcelo, não citar as fontes é plágio: http://info.abril.com.br/edicoes/234/arquivos/5316_1.shl (E citar info exame é pior que plágio.)

Da próxima vez sua mensagem será exluída. Como já estou de saco cheio de excluir mensagens suas peço o mínimo de cuidado antes de postar.

M

pcalcado:

Marcelo, não citar as fontes é plágio: http://info.abril.com.br/edicoes/234/arquivos/5316_1.shl (E citar info exame é pior que plágio.)

Da próxima vez sua mensagem será exluída. Como já estou de saco cheio de excluir mensagens suas peço o mínimo de cuidado antes de postar.

:?: Direito de Resposta:

Fonte Wikipédia

O plágio é o ato de assinar ou apresentar uma obra intelectual de qualquer natureza (texto, música, obra pictórica, fotografia, obra audiovisual, etc) contendo partes de uma obra que pertença a outra pessoa sem colocar os créditos para o autor original. No ato de plágio, o plagiador se apropria indevidamente da obra intelectual de outra pessoa, assumindo a autoria da mesma.

:idea: Bom, não plágiei nada e a exposição ao texto ao qual o Sr.Pcalcado afirma. Pois não disse que tal sitação de parte textual que a obra de autoria é minha, ou fora publicada por mim, ou assinada isso em materia ou noticiáro contendo minha assinatura.Sendo assim o Pcalcado deu um falso testemunho e argumentação banalizando e por pobre interpretação e falta de conhecimento do sentido da palavra plágio.

:arrow:Não existe apropriação de obra intelectual, o texto em parte fora exposto em fórum entranto com sentindo informativo pois a informação existe ao link publicado assim como o Sr.Pcalcado o localizou e viu materia na integra ou também sitada em outra fonte virtual, confirmando que não é de minha autoria e assinatura, se não apresentei link isso não me qualifica em termos de plágio, o texto esta virtualmente publicado e sedido por seu autor.

Presta mais atenção no que afirma, ou procura um professor melhor.

P

Até a última vez que eu consultei a Wikipedia não era advogado. De qualquer forma, sua mensagem está assinada por você, incluindo nome de sua empresa, seu blog e o que mais for, então ou você deixa explícito que o texto não é seu (por exemplo usando [quotes]) ou a sua assinatura embaixo faz com que você esteja assumindo autoria. Eu não tenho mais nada para falar em tópicos sobre este assunto, se tiver algum problema com o posicionamento do fórum pode procurar qualquer um dos moderadores.

F

É galera acho que o foco do assunto já foi perdido a muito tempo…

Espero que todos ja tenham sanado suas duvidas, porque as minha já foram sanadas!

Obrigado a todos pelas respostas!

flws

L

Direito de Resposta… kkkkkkkkkk… o topico comceu com um “dia da mentira” e mais tarde virou filosofia e depois foi pra fisica quantica agora virou campanha politica com ate o: “Direito de Resposta” o que mais este topico vai virar?

V

Talvez uma discussão sobre se java tem ponteiros ou não? Ops, já foi também!
Quem sabe alguma coisa sobre closures? Ah, também já foi!
Falar sobre ruby? Já falaram!

hehehe

F

É parece que desistiram de discurtir…

flwsss

M

pcalcado:
Marcio Duran:

:stuck_out_tongue: Enquanto a computação binária clássica opera com chaveamentos excludentes, tipo de sim ou não, ou um ou zero, a quântica usa agentes que podem estar nos dois estados ao mesmo tempo, uma das mais intrigantes propriedades da física quântica. É como se você estivesse tentando sair de um labirinto e surgisse uma bifurcação à frente. No computador binário você só poderia entrar em uma porta de cada vez.

Marcelo, não citar as fontes é plágio: http://info.abril.com.br/edicoes/234/arquivos/5316_1.shl (E citar info exame é pior que plágio.)

Da próxima vez sua mensagem será exluída. Como já estou de saco cheio de excluir mensagens suas peço o mínimo de cuidado antes de postar.

Philip, eu já te disse, é MARCIO. M-A-R-C-I-O. ok?

hehe… :smiley:

Criado 11 de junho de 2008
Ultima resposta 3 de jul. de 2008
Respostas 111
Participantes 23