Eccomi qui con una possibile soluzione.

Allora, l'operazione di assegnazione ( = ) ha il compito di prendere l'elemento a destra, trasformarlo nell'oggetto da lui rappresentato e tentare di metterlo nel'elemento a sinistra.

Quindi un'operazione simile
String prova = "abcde";

prende la string "abcde" la trasforma in una Stringa ( in quanto il compilatore sa che " " rappresentano una Stringa ) e cerca di assegnarla alla classe String.
Quindi il tutto viene fatto da un operatore.

Ora....come fare a creare una nuova classe Stringa.

Ti faccio un esempio prima di proseguire.
codice:
class Pippo{
...
}

class Cane_di_pippo extends Pippo{
...
}

class Paperino{
...
}

//all'interno di una classe main
Cane_di_pippo cdp = new Cane_di_pippo();
Pippo pippo = cdp;

pippo = new Paperino();
...
Allora, la prima assegnazione non da problemi, dato che per ereditarietà la classe Cane_di_pippo è anche una classe Pippo, quindi nessun problema ad effettuare questa assegnazione, mentre questo non accade per la classe Paperino che non estende la classe Pippo.

Questo per dirti che....
MiaString prova = "abcde";

Puoi creare la classe MiaString e riuscire ad ottenere una cosa simile se e solo se riesci ad implementare a MiaString una classe estesa di String.

codice:
public final class String
extends Object
implements Serializable, Comparable, CharSequence
e l'unica classe che String estende è Object, quindi se riesci a lavorare con Object e sappi che
codice:
Object test = "abcde";
è un'operazione perfettamente lecita....dovrai poi implementare anche le interfaccie che ti permettano di lavorare correttamente con i tipi di Stringa che vuoi implementare....

Sempre a disposizione.