When the method is called, ar1 is a reference to the array object.
The method findMax() gets a reference to the array, so it can
access the elements of that array object.
Here is a complete program that contains both classes.
class ArrayOps
{                          // the parameter x refers to the data
  int findMax( int[] x )   //  this method is called with.                     
  {
    int max = x[0];
    for ( int index=0; index <x.length; index++ )
      if ( x[index] > max )
        max = x[index] ;
    return max ;
  }
}
class ArrayDemo
{
  public static void main ( String[] args ) 
  {
    int[] ar1 =  { -20, 19, 1, 5, -1, 27, 19, 5 } ;
    ArrayOps operate = new ArrayOps();     // create an ArrayOps object
    int biggest = operate.findMax( ar1 );  // call the findMax() method with the array
    System.out.println("The maximum is: " + biggest );
  }
}      
When you run the program it prints out "The maximum is: 27". You might want to copy this program to a file (call it ArrayDemo.java) and play with it.
During one run of the program, how many arrays are created?