/*
爷爷 --- 父亲 --- 儿子
*/
class GrandFather {
public void song() {
System.out.println("唱山歌");
}
}
class Father extends GrandFather {
public void song() {
System.out.println("唱情歌");
}
}
class Son extends Father {
public void song() {
System.out.println("唱儿歌");
}
}
public class PolyDemo4 {
public static void main(String[] args) {
GrandFather gf = new Father();//向上
gf.song();//唱情歌
GrandFather gf1 = new Son();//向上跨阶层
gf1.song();//唱儿歌
Father f = (Father) gf1;//向下
f.song();//唱儿歌
Father f1 = new Son();//向上
f1.song();//唱儿歌
Son s=(Son)gf1;
s.song();//唱儿歌
//ClassCastException
// Son s = (Son)((Father)gf);
//总结一句话 从右往左能读通的就可以转换,读不通的就不可以
}
}
package shujia.day1.day4;
/*
继承的时候:
子类中有和父类一样的方法的时候,叫重写,覆盖
子类中没有和父类一样的方法的时候,方法就被继承过来,但是当子类重写了父方法
结果就是被重写的那个结果
*/
class A{
public void show(){
show2(); //1
}
public void show2(){
System.out.println("这是show2方法"); //2
}
}
class B extends A{
// public void show(){
// show2();
// }
public void show2(){
System.out.println("这是在B里面的show2方法");//3
}
}
class C extends B{
public void show(){
super.show();//4
}
public void show2(){
System.out.println("这是在C里面的show2方法");//5
}
}
public class PolyDemo5 {
public static void main(String[] args) {
A a = new B();
a.show(); //
/*向上转型,先访问子类B没有show()方法,子类继承父类A的公共方法,并重写覆盖2,此时2变成"这是在B里面的show2方法"
向父类找show方法,到1,执行2输出这是在B里面的show2方法
*/
B b = new C();
b.show();
/*向上转型,先访问子类C show()方法,子类C继承父类B的公共方法,并重写覆盖5,此时2变成"这是在C里面的show2方法"
子类C执行show方法,先执行4 super.show();到父类B继承A的1 show()方法,执行1中 show2()打印2输出这是在C里面的show2方法
*/
}
}