Interessante

O que acontece quando o código é compilado? Por que?

public class Teste {   
  public static void main(String[] args) { 
    byte a, b;
    char c = '\u0000';
    
    a = '\u0000';
    b = c;
    
    System.out.println("" + a + b);
 } 
}

esquece, não compila… a atribuição b = c é inválida, tu ta atribuindo um char a um byte… um é maior do q outro… precisa de cast

acontece que você está atribuindo um byte(8bits) a um char(16bits),
ai o compilador reclama, agora ele reclama logo de cara porque
b recebe o conteudo de c; que eh uma variavel, q pode ser alterado
o valor do conteudo, por isso q ele reclame mesmo q c seja = 0
e 0 eh suportado por b;

agora em

não reclama , porque a esta recendo uma literal, que ja sabemos
de ante mao se eh possivel um byte suportar ou naum ,
nesse caso sabemos q um char eh representado por uma valor unicode
em hexadecimal de 4 digitos, logo ‘\u0000’ tem valor 0.
como o valor maximo suportado por um byte eh 127 .

ate 127 = 7F (hexa) o compilador naum reclama,

ja 128 = 80 (hexa) já naum eh mais suportado.