java 多态
2015-10-29 16:37
106 查看
java 多态
多态==晚绑定。
不要把函数重载理解为多态。
因为多态是一种运行期的行为,不是编译期的行为。
多态:父类型的引用指向子类型的对象。
比如 Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能覆盖,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
(参考学习链接:http://docs.oracle.com/javase/tutorial/java/IandI/override.html)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。
因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。
多态示例代码
这段代码:
//编译错误
//用父类引用调用父类不存在方法
Animal al = new Animal();
al.eat();
Cat类中定义了eat()方法,但是Animal类中没有这个方法,a1引用是Animal类的,所以找不到,编译时出错:
(1)向上类型转换(Upcast):将子类型转换为父类型。
对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名。
//向上类型转换
Cat cat =new Cat();
Animal animal =cat;
animal.sing();
(2)向下类型转换(Downcast):将父类型转换为子类型。
对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换。
//向下类型转换
Animal a =new Cat();
Cat c =(Cat)a;
c.sing();
并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。
不然也会编译出错:
因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。
多态==晚绑定。
不要把函数重载理解为多态。
因为多态是一种运行期的行为,不是编译期的行为。
多态:父类型的引用指向子类型的对象。
比如 Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能覆盖,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
(参考学习链接:http://docs.oracle.com/javase/tutorial/java/IandI/override.html)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。
因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。
多态示例代码
{ public static void main(String[] args) { //向上类型转换 Cat cat = new Cat(); Animal animal = cat; animal.sing(); //向下类型转换 Animal a = new Cat(); Cat c = (Cat)a; c.sing(); c.eat(); //编译错误 //用父类引用调用父类不存在的方法 //Animal a1 = new Cat(); //a1.eat(); //编译错误 //向下类型转换时只能转向指向的对象类型 //Animal a2 = new Cat(); //Cat c2 = (Dog)a2; } } class Animal { public void sing() { System.out.println("Animal is singing!"); } } class Dog extends Animal { public void sing() { System.out.println("Dog is singing!"); } } class Cat extends Animal { public void sing() { System.out.println("Cat is singing!"); } public void eat() { System.out.println("Cat is eating!"); } 运行结果: cat is singing. cat is singing. cat is eating.
这段代码:
//编译错误
//用父类引用调用父类不存在方法
Animal al = new Animal();
al.eat();
Cat类中定义了eat()方法,但是Animal类中没有这个方法,a1引用是Animal类的,所以找不到,编译时出错:
两种类型的类型转换
(1)向上类型转换(Upcast):将子类型转换为父类型。对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名。
//向上类型转换
Cat cat =new Cat();
Animal animal =cat;
animal.sing();
(2)向下类型转换(Downcast):将父类型转换为子类型。
对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换。
//向下类型转换
Animal a =new Cat();
Cat c =(Cat)a;
c.sing();
并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。
不然也会编译出错:
因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。
相关文章推荐
- Java中的匿名内部类
- java 深拷贝浅拷贝
- java中main方法详解
- eclipse安装插件提示Duplicate Location错误的解决办法
- java switch语句
- Java 并发编程(三)为线程安全类中添加新的原子操作
- Java读取properties文件的思考(static块中读取)
- SpringMVC+Shiro权限管理
- java反射-Method
- 关于java里的instanceof运算符(总结于疯狂JAVA讲义)
- myeclipse和intellij安装并使用git
- Spring学习2--IOC应用
- java之装饰设计模式和继承的简单区别
- 打印Java main方法执行的命令参数代码
- Java重写方法与初始化的注意事项
- java入门--java基本环境配置
- spring启动时加载ContextLoaderListener监听器
- JAVA操作Excel文件
- JAVABEAN是什么和总结JAVABEAN的两种使用方式06-7-23
- Java生成和操作Excel文件