Q:

Why can I pass a char to a method that takes an int?

Class Example{
static void go(int a)
{
    System.out.println(a);
}
public static void main(String[] args) {

    go('c'); //prints 99
}
}

But, if i change the  method to static void go(byte), gives error:The method go(byte) in the type Example is not applicable for the arguments (char).

A:

It's due to Widening Conversion or Implicit Casting

If a value of narrower (lower size) data type converted to a value of
  a broader (higher size) data type without loss of information, is
  called Widening conversion. This is done implicitly by the JVM and
  also known as implicit casting. For example an integer data type is
  directly converted to a double.

Example
int a = 100; 
double b = a;
System.out.println(b);

In above example integer (4 Byte) converted into double (8 Byte)

Widening conversion is allowed in the following cases:

byte can be converted to short, int, long, float, or double
Short can be converted to int, long, float, or double
char can be converted to int, long, float, or double
int can be converted to long, float, or double
long can be converted to float or double
float can be converted to double

Now Coming to 

But, if i change the method to static void go(byte), gives error:The
  method go(byte) in the type Example is not applicable for the
  arguments (char).

This is due to Narrowing Conversion

If a value of broader (higher size) data type converted to a value of
  a narrower (lower size) data type which can result in loss of
  information, is called Narrowing conversion. This is not done
  implicitly by the JVM and requires explicit casting. For example
  double data type explicitly converted into integer

Since  char is 16 bits while a byte is 8 bits So you have to explicitly cast like this :
char c='c';
byte b=(byte)c;
go(b);

