Por que o suporte a java não passa por referência como C ++?

Eu li todos os lugares em que esse tipo de dados primitivo e referências a objects são passados ​​por valor?

Eu tentei pesquisar no Google por que o suporte a java não passa por referência, mas eu só recebo java não suporta passagem por referência e não consegui encontrar nenhum motivo por trás disso .

Por que você não pode passar o tipo de dados primitivo por referência?

Edit: A maioria das pessoas fecharam a minha questão, assumindo que é subjetivo e argumentativo.

Bem, não é, tem uma resposta definitiva, minha pergunta é como por que você não pode criar um object de class abstrata e não é duplicado também porque a maioria da resposta simplesmente diz NÃO.

Obrigado.

Por design:

Algumas pessoas dirão incorretamente que os objects são passados ​​”por referência”. No design de linguagem de programação, o termo passar por referência corretamente significa que, quando um argumento é passado para uma function, a function chamada obtém uma referência ao valor original, não uma cópia de seu valor. Se a function modificar seu parâmetro, o valor no código de chamada será alterado porque o argumento e o parâmetro usam o mesmo slot na memory …. A linguagem de programação Java não passa objects por referência; ele passa referências de objects por valor. Como duas cópias da mesma referência se referem ao mesmo object real, as alterações feitas por meio de uma variável de referência são visíveis através da outra. Existe exatamente um modo de passagem de parâmetros – passar por valor – e isso ajuda a manter as coisas simples. – James Gosling, e outros, The Java Programming Language, 4a Edição

Quanto a razões mais profundas, aqui está minha opinião: é a combinação de dois fatos:

  1. A última linha da citação de Gosling: “… que ajuda a manter as coisas simples …”
  2. Ao contrário do C ++, o Java é coletado com todos os objects alocados no heap.

Eu não posso evitar se você não gosta do primeiro. Você terá que dizer a James Gosling e Bill Joy e a todos os outros que projetaram Java que eles cometeram um erro crítico. Boa sorte com isso. Java é muito mais amplamente usado que o C ++ hoje por várias medidas. O mercado, por mais imperfeito que seja, não penalizou o Java pelo que você percebe como um descuido.

Passar por valor em C ++ coloca ônus tanto no desenvolvedor (por exemplo, requisito de construtores de atribuição e cópia) quanto no compilador (por exemplo, diferenciando entre variables ​​de pilha e heap, todas as permutações de passagem por valor e referência com const e não const).

O segundo pode ter mais uma explicação técnica além do gosto dos designers. Não sou especialista em design e implementação de sistemas coletados pelo lixo, mas talvez isso tenha influenciado sua escolha por uma razão técnica que eu não conheço.

Meu entendimento é que a razão para não ter passagem por referência é principalmente por razões de segurança: passar as coisas por referência permitiria que uma function altere coisas que estão fora de seu escopo e isso significa que meu object (referência) pode ser substituído se eu chamar uma function maliciosa.

Para elaborar: Em Java, o encapsulamento é importante e uma medida de segurança. Ao dar um (ponteiro) a um object para uma function que alguém escreveu, eu (como o chamador) deveria estar convencido de que a function que eu chamo só pode fazer com esse object o que eu permiti que ele fizesse (usando membros públicos). Permitir que um PBR me deixasse (como o chamador) em um estado desconhecido após a conclusão da function, pois não saberia se estou manipulando meu próprio object ou algo mais …