継承について質問させてください
public class Parent{
public void hoge(){ System.out.println("p_hoge"); }
private void piyo(){ System.out.println("p_piyo"); }
}

public class Child extends Parent{
public void hoge(){ System.out.println("c_hoge"); }
public void piyo(){ System.out.println("c_piyo"); }
}

public class Main {
public static void main(String[] args) {
Child child1 = new Child();
Parent child2 = child1;
child1.hoge(); // c_hoge
child1.piyo(); // c_piyo
child2.hoge(); // c_hoge
child2.piyo(); // error: piyo() has private access in Parent
}
}

ここで、child2.piyo()がコンパイルエラーになるのは何故でしょうか
確かに型はParent型ですが、単にChildインスタンスへの参照を代入しただけなので
関係ないかと思ったのですが
実際child2.hoge()はChildクラスのhogeメソッドを実行してますし、Parentクラスの
piyoメソッドのアクセス制限をpublicにするとchild2.piyo()は「c_piyo」を出力します
あるいは Parent child3 = new Child();としても同じ結果でした
コンパイルの際、型情報はどういう順番でチェックされているのですか?