java面向对象(多态)
2015-07-18 18:54
447 查看
多态:可以理解为事物存在的多中体现形态。
人:男人,女人,
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
1,多态的体现。
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类的对象。
2,多态的前提。
必须是是类与类之间有关系,要么继承,要么实现。
通常还是有一个前提:存在覆盖。
3,多态的好处。
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态的转型:
多态的成员特点:
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调
用的方法。如果有,编译通过,如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行。都参考做左边。
人:男人,女人,
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
1,多态的体现。
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类的对象。
2,多态的前提。
必须是是类与类之间有关系,要么继承,要么实现。
通常还是有一个前提:存在覆盖。
3,多态的好处。
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void kanjia() { System.out.println("看家"); } } class DuoTaiDemo { public static void main(String[] args) { /* //Cat c = new Cat(); //c.eat(); //Dog d = new Dog(); //d.eat(); Cat c = new Cat(); Cat c1 = new Cat(); funcation(c1); funcation(new Dog()); } public static void funcation(Cat c) { c.eat(); } public static void function(Dog d) { d.eat(); } */ public static void funcation(Animal a) { a.eat(); } funcation(new Cat()); funcation(new Dog()); }
多态的转型:
abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void kanjia() { System.out.println("看家"); } } class DuoTaiDemo2 { public static void main(String[] args) { Animal a = new Cat();//类型提升。向上转型。 a.eat() ; //如果想要调用猫的特有方法时,如何操作? //强制将父类的引用,转成子类类型,向下转型。 Cat c = (Cat)a; c.catchMouse(); //千万不要出现这样的操作。就是将父类对象转成子类类型。 //我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换. //多态自始至终都是子类对象在做着变化。 //Animal a = new Animal(); //Cat c = (Cat)a; function(new Dog()); } public static void function(Animal a) { a.eat(); //instanceof:引用数据类型判断是否是所属类型. if(a instanceof Cat) { Cat c = (Cat)a; c.catchMouse(); } else if(a instanceof Dog) { Dog c = (Dog)a; c.kanjia(); } } }
多态的成员特点:
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调
用的方法。如果有,编译通过,如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行。都参考做左边。
class Fu { void method1() { System.out.println("fu method_1"); } } class Zi extends Fu { void method2() { System.out.println("zi method_2"); } void method3() { System.out.println("zi method_3"); } } class DuoTaiDemo4 { public static void main(String[] args) { Fu f = new Zi(); z.method1(); z.method2(); //z.method3();当调用这个方法时,编译失败. //Zi z = new Zi(); //z.method1(); //z.method2(); //z.method3(); } }
相关文章推荐
- 初识JAVA1
- Java IO: InputStream
- Java学习笔记之<JDBC连接MySQL的步骤>
- java面向对象(接口)
- java面向对象(抽象类)
- 2015第29周六Spring
- 最近最小天数日期计算,程序有问题~
- java面向对象(继承)
- java中的类型转换
- 快速排序-java
- springmvc的3中路径风格
- Java JVM 垃圾回收
- 两种方式将Eclipse中的项目生成git并且提交到github上面
- java面相对象(封装)
- java.lang.Exception: libsvm classes not in CLASSPATH!问题解决方法
- 堆排序-java
- java函数
- Spring IOC 注入方式详解 附代码
- javaSendEmail 的使用
- openSUSE中启动eclipse,但是无法启动中文输入法……