黑马程序员_多态

来源:互联网 发布:python脚本执行py文件 编辑:程序博客网 时间:2024/04/28 16:29

----------------------------------------------------------------------------- android培训、java培训、期待与您交流! --------------------------------------------------------------------------------

多态(polymorphic

是继数据抽象和继承之后的第三种基本特性。

 

多态通过分离“做什么”和“怎么做”,从另一角度将接口和实现分离开来。多态不但能够改善代码的组织接口和可读性,还能够创建“可扩展的”程序,即无论在项目最初创建时,还是在需要添加新功能时,都可以进行扩充。

 

方法调用绑定

将一个方法调用同一个方法主题关联起来被称作“绑定(binding)”。若在程序执行前进行绑定(如果有的话,由编译器和链接程序实现),叫做“前期绑定(early binding”。 

当编译器只有一个引用时,它无法知道究竟调用哪个方法。 

解决的办法叫做“后期绑定(late binding)”,它的含义就是在运行时,根据对象的类型进行绑定。后期绑定也叫做“动态绑定(dynamic binding)”或“运行时绑定(run-time binding)”。

 

如果想要调用猫的特有方法时,如何操作?

强制将父类的引用,转成子类类型。向下转型。

不要将父类对象转成子类类型。

我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。

多态自始自终都是子类对象做着变化。

 

多态中成员函数的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

简单总结:成员函数在多态调用时,编译看左边,运行看右边。

 

在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)。

 

在多态中,静态成员函数的特点:

无论编译和运行,都参考做左边。

 

静态方法是不需要对象的。在进行父类对象的引用还在,它找的就是父类中的方法。它看的是引用型变量所属的类的。

静态的时候父类走父类,子类走子类。

/*多态:可以理解为事物存在的多种体现形态。人:男人,女人动物:猫,狗。猫 x = new 猫();动物 x = new 猫();1,多态的体现父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象。2,多态的前提必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提:存在覆盖。3,多态的好处多态的出现大大的提高程序的扩展性。4,多态的弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。5,多态的应用*//*动物,猫,狗。*/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 Pig extends Animal{public void eat(){System.out.println("饲料");}public void gongDi(){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();function(c1);function(new Dog());function(new Pig());*///Animal c = new Cat();//c.eat();function(new Cat());function(new Dog());function(new Pig());}public static void function(Animal a)//Animal a = new Cat();{a.eat();//a.catchMouse();}/*public static void function(Cat c)//{c.eat();}public static void function(Dog d){d.eat();}public static void function(Pig p){p.eat();}*/}


 

Object-equals()

Object是类层次结构的根类。

Object:是所有对象的直接后者间接父类,传说中的上帝。

该类中定义的肯定是所有对象都具备的功能。

 

其实比较的是地址

 

Object类中已经提供了对对象是否相同的比较方法;

如果自定义类中也有比较相同的功能,没有必要重新定义;

只要沿袭父类中的功能,建立自己特有的比较内容即可,这就是覆盖。

/*Object:是所有对象的直接后者间接父类,传说中的上帝。该类中定义的肯定是所有对象都具备的功能。Object类中已经提供了对对象是否相同的比较方法。如果自定义类中也有比较相同的功能,没有必要重新定义。只要沿袭父类中的功能,建立自己特有比较内容即可。这就是覆盖。*/class Demo //extends Object{private int num;Demo(int num){this.num = num;}public boolean equals(Object obj)//Object obj = new Demo();{if(!(obj instanceof Demo))return false;Demo d = (Demo)obj;return this.num == d.num;}/*public boolean compare(Demo d){return this.num==d.num;}*/public String toString(){return "demo:"+num;}}class Person {}class ObjectDemo {public static void main(String[] args) {Demo d1 = new Demo(4);System.out.println(d1);//输出语句打印对象时,会自动调用对象的toString方法。打印对象的字符串表现形式。Demo d2 = new Demo(7);System.out.println(d2.toString());//Demo d2 = new Demo(5);//Class c = d1.getClass();////System.out.println(c.getName());//System.out.println(c.getName()+"@@"+Integer.toHexString(d1.hashCode()));//System.out.println(d1.toString());//Person p = new Person();///System.out.println(d1.equals(p));}}


 

instanceof

是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。

 

为什么要向上转型?

向上转型表明的是这个引用变量的编译类型是父类,但实际执行它的方法时,依然表现出的是子类对象的行为方法。如果没有自动转型,会引发数据类型不符的异常。

即ClassCastException,多态时候很容易看出来。

 

 

 

 

 

----------------------------------------------------------------------------- android培训、java培训、期待与您交流!--------------------------------------------------------------------------------
详细请查看:http://edu.csdn.net/heima/