Perché il supporto java non passa per riferimento come C ++

Ho letto ogni punto in cui quel primitivo datatype e riferimento ad oggetti sono passati per valore?

Ho provato a cercare in Google perché il supporto java non passa per riferimento, ma Java non supporta solo il passaggio per riferimento e non ho trovato alcun motivo dietro di esso .

Perché non puoi passare il datatype primitivo per riferimento?

Modifica: la maggior parte delle persone ha chiuso la mia domanda supponendo che sia soggettiva e polemica.

Beh, non lo è, ha una risposta definita, la mia domanda è come perché non puoi creare un object di class astratta e non è duplicato anche perché la maggior parte della risposta dice semplicemente NO.

Grazie.

Per progetto:

Alcune persone diranno in modo errato che gli oggetti vengono passati “per riferimento”. Nella programmazione del linguaggio di programmazione, il termine passa per riferimento correttamente significa che quando un argomento viene passato a una funzione, la funzione invocata ottiene un riferimento al valore originale, non una copia del suo valore. Se la funzione modifica il suo parametro, il valore nel codice chiamante verrà modificato perché l’argomento e il parametro utilizzano lo stesso slot in memoria …. Il linguaggio di programmazione Java non passa oggetti per riferimento; passa i riferimenti agli oggetti per valore. Poiché due copie dello stesso riferimento si riferiscono allo stesso object reale, le modifiche apportate attraverso una variabile di riferimento sono visibili attraverso l’altra. Esiste esattamente una modalità di passaggio dei parametri – passa per valore – e ciò aiuta a mantenere le cose semplici. – James Gosling, et al., The Java Programming Language, 4th Edition

Per ragioni più profonde, ecco la mia opinione: è la combinazione di due fatti:

  1. L’ultima riga della citazione di Gosling: “… che aiuta a mantenere le cose semplici …”
  2. A differenza di C ++, Java è garbage collection con tutti gli oggetti allocati nell’heap.

Non posso farci niente se non ti piace il primo. Dovrai dire a James Gosling e Bill Joy ea tutti gli altri che hanno progettato Java di aver commesso un errore critico. Buona fortuna. Oggi Java è molto più diffuso del C ++ con diverse misure. Il mercato, per quanto imperfetto, non ha penalizzato Java per ciò che percepisci come una svista.

Passare in base al valore in C ++ pone degli oneri sia sullo sviluppatore (ad es. Requisito dei costruttori di assegnazioni e copie) che sullo scrittore del compilatore (ad esempio, distinguendo tra variabili stack e heap, tutte le permutazioni di passaggio per valore e riferimento con const e non-const).

Il secondo potrebbe avere più di una spiegazione tecnica oltre al gusto dei designer. Non sono un esperto nella progettazione e implementazione di sistemi di raccolta dei rifiuti, ma forse ciò ha influenzato la loro scelta per motivi tecnici che non conosco.

La mia comprensione è che la ragione per cui non si ha il pass-by-reference è principalmente per ragioni di sicurezza: passare le cose per riferimento consentirebbe a una funzione di cambiare cose che sono al di fuori del suo scopo e ciò significa che il mio object (riferimento) può essere sostituito se io chiama una funzione dannosa.

Per elaborare: In Java, l’incapsulamento è importante e una misura di sicurezza. Quando assegnando un (puntatore) a un object a una funzione che qualcun altro ha scritto, io (come il chiamante) dovrei essere convinto che la funzione che chiamo può fare solo con quell’object ciò che gli ho permesso di fare (usando membri pubblici). Permettere un PBR mi lascerebbe (come il chiamante) in uno stato sconosciuto dopo che la funzione è finita perché non saprei se sto gestendo il mio object o qualcos’altro …