向上转型、向下转型和动态绑定机制
2019-04-07 09:13
106 查看
- 分类:向上转型,向下转型
- 向上转型: Father f = new Son();(形成指向子类对象的父类引用)
- 向下转型: Son s = (Son) f;
- 上面的都是指向Son对象
- 子类对象不能指向父类对象
Father f = new Father();
Son s = (Son)f;//错误 - 总结:
1、父类引用指向子类对象,而子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换吗,如:
Father f1 = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换,如:(向上转型后再强制赋给子类引用)
f1 就是一个指向子类对象的父类引用。把f1赋给子类引用 s1 即 Son s1 = (Son)f1;
其中 f1 前面的(Son)必须加上,进行强制转换。
class Animal{ public void eat(){ System.out.println("动物吃东西"); } } class Bird extends Animal{ public void eat(){ System.out.println("鸟儿在吃虫子"); } public void fly(){ System.out.println("鸟儿在飞"); } } public class Main{ public static void main(String []args){ Animal animal = new Bird();//向上转型 animal.eat(); //animal.flu();//错误 Bird bird = (Bird)animal;//向下转型 bird.eat(); bird.fly(); dosleep(new male()); dosleep(new femal()) } public static void dosleep(Human h){ h.sleep(); } } public class Human { public void sleep() { System.out.println("Human sleep.."); } } class Male extends Human { @Override public void sleep() { System.out.println("Male sleep.."); } } class Female extends Human { @Override public void sleep() { System.out.println("Female sleep.."); } }
2、向上转型的好处
看上面的代码:
public static void dosleep(Human h) {
h.sleep();
}
这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果 dosleep 以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了 JAVA 的抽象编程思想。
二、向下转型。
与向上转型相反,即是把父类对象转为子类对象
public class Girl { public void smile(){ System.out.println("girl smile()..."); } } class MMGirl extends Girl{ @Override public void smile() { System.out.println("MMirl smile sounds sweet..."); } public void c(){ System.out.println("MMirl c()..."); } } class Mian(){ public static void main(String []args){ //向下转型的前提是有向上转型 Girl girl = new MMGirl(); girl.smile(); MMGirl mmg = (MMGirl)girl; mmg.smile(); mmg.c(); /*Girl g = new Girl(); MMGirl mmg = (MMGirl) g;//不安全的向下转型,编译无错但会运行会出错 */ } }
**
静态绑定和动态绑定
- 绑定就是将方法调用和所在的类连接起来
- 为了实现多态
- 分类:动态绑定和静态
- 静态:程序运行之前(和普通类一样,美区别)
- 动态: 根据需要绑定(动态产生对象)
Human human[] = new Human[5]; for(int i = 0;i < human.length;i++){ int n = (int)(Math.random()*3); switch(n){ case 0: human[i] = new Chinese();break; case 1: human[i] = new American();break; case 2:human[i] = new British();break; } } for(int i = 0;i < human.length;i++){ human[i].speak(); }
动态产生chinese,american,british 对象
相关文章推荐
- Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)
- Java 基础(8)—— 向上转型、向下转型、动态绑定、静态绑定
- Java动态(后期)绑定和overloading 向上转型
- 向上转型:动态绑定--[Java]
- JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制
- Java动态(后期)绑定和overloading 向上转型
- JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制
- Java动态(后期)绑定和overloading 向上转型
- Java动态(后期)绑定和overloading 向上转型
- c++中向上转型和向下转型,动态转换,和静态转换详解
- JAVA中的向下转型(downcasting)及泛型与向上转型(upcasting)及RTTI、反射机制
- 多态 向上转型 动态绑定
- Java动态(后期)绑定和overloading 向上转型
- Java动态(后期)绑定和overloading 向上转型
- 七、java向上转型和向下转型的理解
- 向上向下转型的使用和自己的一个小补充。
- java向上转型和向下转型
- Java向上转型与向下转型
- 向上转型,向下转型
- Java向上转型和向下转型