向上转型
class father { public void eat(){ System.out.println("father eat()"); } } class son extends father { public void sleep(){ System.out.println("son sleep()"); } public void eat(){ System.out.println("son eat()"); } } public class test1 { public static void main(String[] args) { father f = new son();//向上转型 f.eat(); //f.sleep() f虽然也指向了son对象,但是向上转型的代价是会丢丢失与父类不同的方法 } }
向上转型的好处
这样使代码变得简洁。体现了JAVA的抽象编程思想。
向下转型
class father { public void eat(){ System.out.println("father eat()"); } } class son extends father { public void sleep(){ System.out.println("son sleep()"); } public void eat(){ System.out.println("son eat()"); } } public class test1 { public static void main(String[] args) { father f = new son();//向上转型 f.eat(); //f.sleep() f虽然也指向了son对象,但是向上转型的代价是会丢丢失与父类不同的方法 son s = (son)f;//向下转型 s.eat(); s.sleep(); /* * 这种方法运行的时候会报错 father fa = new father(); son so = (son)fa; so.eat(); so.sleep(); */ } }
Java为了解决不安全的向下转型问题,引入泛型的概念
为了安全的类型转换,最好先用 if(A instanceof B) 判断一下
总结
1、父类引用可以指向子类对象,子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
如Father father = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;
其中father前面的(Son)必须添加,进行强制转换。
4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。