I am trying to understand how interfaces work. I have read basic interface tutorials online and watched a few videos so i do have a good idea of what a interface is and its advantages. However i came across this piece of code that is utilizing interface feature and am having trouble getting my head around some of it. So i needed someone to just breakdown what exactly is happening. I will also write down what i understand of it so far so if i am wrong you can correct me.
Here is the Code.
Bank Account Class
package Interface;
public class BankAccount implements Measurable {
    private double balance;
    public BankAccount() {
        balance = 0;
    }
    public BankAccount(double initialBalance) {
        balance = initialBalance;
    }
    public void deposit(double amount) {
        double newBalance = balance + amount;
        balance = newBalance;
    }
    public void withdraw(double amount) {
        double newBalance = balance - amount;
        balance = newBalance;
    }
    public double getBalance() {
        return balance;
    }
    public double getMeasure() {
        return balance;
    }
}
Coin Class
package Interface;
public class Coin implements Measurable {
    private double value;
    private String name;
    public Coin(double aValue, String aName) {
        value = aValue;
        name = aName;
    }
    public double getValue() {
        return value;
    }
    public String getName() {
        return name;
    }
    public double getMeasure() {
        return value;
    }
}
Interface
package Interface;
public interface Measurable {
    double getMeasure();
}
Data Set Class
package Interface;
public class DataSet {
    private double sum;
    private Measurable maximum;
    private int count;
    public DataSet() {
        sum = 0;
        count = 0;
        maximum = null;
    }
    public void add(Measurable x) {
        sum = sum + x.getMeasure();
        if (count == 0 || maximum.getMeasure() < x.getMeasure())
            maximum = x;
        count++;
    }
    public double getAverage() {
        if (count == 0)
            return 0;
        else
            return sum / count;
    }
    public Measurable getMaximum() {
        return maximum;
    }
}
Test Class
package Interface;
public class Test {
    public static void main(String[] args) {
        DataSet bankData = new DataSet();
        bankData.add(new BankAccount(100));
        bankData.add(new BankAccount(100000));
        bankData.add(new BankAccount(10));
        Measurable max = bankData.getMaximum();
        System.out.println("Maximum :" + max.getMeasure());
        DataSet coinData = new DataSet();
        coinData.add(new Coin(0.25, "Quarter"));
        coinData.add(new Coin(0.10, "Dime"));
        coinData.add(new Coin(0.05, "Nickel"));
        max = coinData.getMaximum();
        System.out.println("Maximum : " + max.getMeasure());
    }
}
What i understand so far
I completely understand the bank class, the coin class and the interface. My problem is i don't quite understand a few things in the DataSet Class. First of all i do not get 
the use of private Measurable maximum; My understanding is after the specifier you usually declare a variable type such as int or double but in this case its assigning a variable name to the interface.  I guess if someone can explain me this then it will help me clarify my understanding of the DataSet class methods like its add method where Measurable parameter is passed. 
Lastly i have difficulty understanding the Test class. I don't get how  bankData.add(new BankAccount(100)); quite works. From what i understand we created a new object of dataset type but i don't get how a new bankaccount object is being created inside it.
If someone can please help me clarify this it would really help me understand interfaces a lot better. i have looked at a lot of simple examples that show very basic code like a car interface with a few methods which are then implemented by specific cars. However those primitive examples don't really help one in understanding the true essence of a interface. I believe this example is more practical and it will help. I apologize if this question is poorly worded as i am new to this java.
 
     
    