Quello che ti ho descritto è ciò che avviene a "basso livello", ovverosia è ciò che fa Java "fisicamente" con i singoli bit (il procedimento è valido per tutti i tipi di dato INTERI, non solamente con byte e int).
Da un punto di vista un po' più "alto" ("sotto" Java lavora sempre nello stesso modo, ma quello che alla fine vedi tu - programmatore - sono solitamente numeri decimali, non binari) puoi vedere lo stesso risultato anche in un altro modo. Come probabilmente sai, per come sono rappresentati in binario, succede che i numeri interi siano "circolari": ovverosia, è come se il successivo del più grande numero rappresentabile sia il più piccolo numero rappresentabile. In termini molto più semplici, ragionando con i "byte", se fai 127 + 1 ottieni -128: sforando il valore massimo "riparti" dal valore minimo.
Riprendiamo ora in mano l'esempio del 300.
Immagina di dover "riempire" la variabile "byte" partendo da 0 e sommando 1 di volta in volta.
Naturalmente fino a 127 non ci sono problemi. Rimangono però ancora 300 - 127 = 173 da "piazzare". Andando avanti a sommare 1, succede quello che ti ho descritto: ripartiamo dal valore "minimo" -128 e ci "spostiamo" verso lo 0.
Arrivati a -1 avremo riempito la variabile con altri 128: restano ancora 173 - 128 = 45. Aggiungiamo 1 per arrivare allo 0... ci restano 44, che è esattamente lo stesso valore che avevamo verificato analizzando la situazione dal punto di vista dei bit.

E' una proprietà ottenuta per effetto del modo in cui sono organizzati gli interi in Java... e in un certo senso "spiega" proprio quello che diceva andbin