You are getting confused between two different things - a variable and a value.
i is a variable and 0 (and 200, 100 etc.) is a value (more precisely, a "literal"). Values are always compile time constants. Variables
can be compile time constants if they are declared final.
In both the cases i.e. in :
int i = 0;
int i2 = 5;
Neither i nor i2 is a compile time constant. But 0 and 5 are compile time constants.
Another thing that you seem to be confused about is assigning a value to a variable in this statement: byte b = 200 - 100;
The value 200-100 is 100 and is of type int but 100 is a compile time constant and it can fit into a byte, that is why the assignment is ok. The variable b itself is not a compile time constant though.
Therefore, if you do this:
b = i; <-This will not compile because i is an int and is not a compile time constant while b is a byte (which is smaller than an int)
Compiler cannot know in advance what will be the value of i at runtime and so it cannot allow this statement without a cast.
Why is int i = 0; NOT a compile time constant and in second example is the variable i2 a compile time constant?
Now, you can see why your comparison does not make sense. Saying whether int i = 0; is a compile time constant or not does not make any sense. int i = 0; is a statement.