之前对多态的理解存在偏差,多态不是独立于重载和覆盖存在的,已经进行了修改。

                   今天来介绍java中的三大强功能覆盖,重载和多态。

其实覆盖和重载就是多态的体现,重载是在一个类里面而覆盖是在子类和父类之间。

                   方法覆盖:当一个子类继承了一个父类时,它也同时继承了父类的属性和方法,可以直接使用父类的属性和方法,或者,如果父类的方法不能满足子类的需求,则可以在子类中对父类的方法进行“改造”即覆盖。在覆盖的过程中,需要提供和父类中的被覆盖方法相同的方法名称,输入参数以及返回类型。另外,在子类对父类的方法进行覆盖的过程中,不能使用比父类中的被覆盖方法更严格的访问权限,例如父类中方法的修饰符为public,则子类的覆盖方法不能用protected,default或者private等来限制。

                   方法重载:在java程序中,如果同一个类中有两个相同的方法(方法名相同,返回值相同,参数列表相同)是不行的,因为这样编译器无法将方法的调用和特定的方法联系起来。但是,在一个类中,如果有多个方法具有相同的名称,而有不同的参数,这种情况是允许的,称这种行为为方法的重载。在进行方法的重载时,方法的参数列表必须不同(参数个数不同,参数数据类型不同或者两者皆不同),而方法的返回值可以相同也可以不同。进行方法的重载时要遵守的四条基本原则:1.方法名相同。2.参数列表必须不同。3.返回值可以不同。4.可以相互调用。

java中对象变量的多态:在java中,对象变量是多态的,一个类型为Aclass的变量既可以指向类型为Aclass的对象,又可以指向Aclass的任何子类的对象。实际上多态的作用就是消除类型之间的耦合关系。如果有一个父类,由它派生出了一个子类,那么我们可以将子类的对象赋给父类对象,这是java中“替换原则”的体现,无论何时,只要程序需要一个父类对象,那么就可以用一个子类的对象来替代它,这种能力也叫动态绑定。但是使用多态传递参数时需要注意,一个对象只能有一种确切的数据类型,如果将一个变量声明为父类的引用类型,那么即使它引用的对象是某个子类的对象,编译器也只是将这个对象当作父类类型对象。因此,若一个引用类型变量声明为父类的类型但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。除了父类和子类之间的多态机制,接口和实现它的类之间也可以实现这种多态机制。

                多态中的instanceof运算符:java语言中的多态机制导致了引用变量的声明类型和其实际引用对象的类型可能不一致,为了更准确地鉴别一个对象的真正类型,java引入了instanceof操作符,使用格式为:引用类型变量 instanceof 引用类型。这是一个boolean类型的表达式,指出对象是否是特定的一个实例。

                引用类型的数据转换:各种简单数据类型之间可以进行相互转换,有些转换可以系统自动完成,而有些转换必须在程序中通过强制转换来完成,而对于引用数据类型,也有一个相互转换的机制。分为自定转换和强制转换两种情况:将子类的实例转换成父类的实例总是可行的,而将父类的对象转换成子类的对象时,必须使用强制类型转换,使用运算符“()”。需要注意的是,无论是自动转换还是强制转换,都只能用在有继承关系的对象之间。父类对象与子类对象的转化原则:1.子类对象可以被视为是其父类的一个对象。2.父类对象不能当成是其某一个子类的对象。3.如果一个方法的形式参数定义的是父类对象,那么调用这个方法,可以使用子类对象作为形式参数。4.如果父类对象引用指向的实际上是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用,在转换之前要使用instanceof运算符进行判断。