Nel tuo esempio il fatto che x debba essere statico è causato dal fatto che tenti di stamparlo a video all'interno del main, che è un metodo appunto statico e slegato da qualsiasi istanza della classe B.
Se quel print fosse all'interno del metodo m il compilatore non darebbe errore, perché all'interno del metodo m (di istanza) quel x sarebbe implicitamente this.x, con il this riferito all'istanza su cui il metodo è richiamato (nel tuo caso quel B b che crei poco prima).
Ma nel metodo main quel x viene interpretato come B.x (NomeClasse.variabile è il modo "completo" per riferirsi a una variabile statica, nella classe stessa però è superfluo scrivere il nome della classe, allo stesso modo il this riferito a un'istanza è superfluo all'interno della stessa, sempre che non ci sia un altro parametro con lo stesso nome), perché sei in un contesto che è appunto statico. Se volevi stampare a video il valore dell'intero x dell'oggetto b allora dentro al main puoi riferirti direttamente a quel campo con b.x (sempre che il livello di visibilità lo consenta ovviamente).
Se invece volevi stampare un valore x proprio della classe e non di una particolare istanza... beh lo rendi appunto static!
Il fatto che poi sia considerato un buon design o meno è tutta un'altra cosa (tipicamente metodi/variabili static devono avere una valida motivazione nella programmazione ad oggetti).