classA{publicvoidf(){
System.out.printf("AAAA\n");}}classBextendsA{publicvoidf(){
System.out.printf("BBBB\n");}}classCextendsB{publicvoidf(){
System.out.printf("CCCC\n");}}publicclassM{publicstaticvoidg(A aa){
aa.f();}publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();
C cc =newC();g(aa);g(bb);g(cc);//这就是多态! 同样的代码做不同的事情//向后兼容}}
程序运行示例:
——————————————————————————————————
AAAA
BBBB
CCCC
——————————————————————————————————
classA{publicvoidf(){
System.out.printf("AAAA\n");}}classBextendsA{publicvoidf(){
System.out.printf("BBBB\n");}}publicclassM{publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();// aa = bb;
aa =(A)bb;//单独此行代码不会影响bb的本身类型,这条语句本身是错误的//aa.f();//bb.f();}}
程序运行示例:
——————————————————————————————————
Exception in thread "main" java.lang.ClassCastException:classA cannot be cast to classB(A and B are in unnamed module of loader 'app')
at M.main(M.java:28)
——————————————————————————————————
程序运行示例:(三条注释语句取消后,且删除27行)
——————————————————————————————————
BBBB
——————————————————————————————————
classA{publicvoidf(){
System.out.printf("AAAA\n");}}classBextendsA{publicvoidf(){
System.out.printf("BBBB\n");}publicvoidg(){
System.out.printf("GGGG\n");}}publicclassM{publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();
aa = bb;
aa.f();//OK 此时父类aa在调用子类的重写函数
aa.g();//error 此时父类aa在调用子类的特有函数 //*********}}
程序运行示例:
——————————————————————————————————
M.java:34: 错误: 找不到符号
aa.g();//error 此时父类aa在调用子类的特有函数^
符号: 方法 g()
位置: 类型为A的变量 aa
1 个错误
——————————————————————————————————
classA{}classBextendsA{}publicclassM{publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();
bb =(B)aa;//16行 编译没有错误,但运行时出错! 因为aa指向的是父类的对象
A aa2 =newB();
bb =(B)aa2;//OK 因为aa2本身指向的就是一个B类对象,// 所以可以进行强制转化,注意与16行的区别,在Java中绝不可能直接把父类引用赋给子类引用的}}