The key here is to understand what datatype you're assigning to what.
Java is a strongly typed language. Let's look at a quick example:
You see, the compiler expects that you're going to assign something of type MyObject1 to m1 and m2 (because that's what type of variable they are) but, in the second line, we try to assign something else. At that point, the compiler gets a bit upset and throws an error at you.
So, with that in mind, let's look at your question.
Let's go through each answer and see why it is, or isn't, correct.
A. b2[0][1] = b; Well, now we have to ask ourselves, what is the data type of b2[0][1]? Well, b2 is a 4-D byte array, so b2[0][1] is a 2-D byte array. Now, what is the type of b? b is also a 2-D byte array, so the assignment works perfectly.
B. b[0][0] = b3; In this case, b[0][0] is a byte, as is b3, so we're good to go.
C. b2[1][1][0]= b[0][0]; In this case, we have b2[1][1][0], which is an array of bytes (1 dimensional). b[0][0], however, is a byte, not an array of bytes. So, in this instance, you're trying to assign a byte to a reference to an array of bytes.

The compiler surely doesn't like that, so this answer can't be correct.
D. b2[1][2][0] = b; We have a similar problem here. b2[1][2][0] is a 1-D array of bytes, but b is a 2-D array of bytes. Again, you can't assign one to the other, so this answer is incorrect.
I'll let you go through the last couple because there really isn't anything different about them. If you have more questions, let me know.
I hope that helps,
Corey