目录
一、多态的概念
二、多态的特点
三、instanceof操作符
四、多态的转型
1、向上转型
2、向下转型
五、方法重写
六、小结
面对对象程序设计的三大支柱是封装、继承和多态。多态意味着父类型的变量可以引用子类型的对象。
继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。参考案例如下:
public class PolymorphismDemo{ /** Main method */ public static void main(String[] args){ displayObject(new Circle(1,"red",false)); displayObject(new Rectangle(1,1,"black",true)); } public static void displayObject(GeometriicObject object){ System.out.println("Created on "+ object.getDateCreated()+".Color is"+object.getColor()); } }
Created on Mon Mar 09 19:25:20 EDT 2011.Color is red
Created on Mon Mar 09 19:25:20 EDT 2011.Color is black
方法displayObject具有GeometriicObject类型的参数。可以通过传递任何一个GeometriicObject的实例来调用displayObject。使用父类对象的地方都可以使用子类的对象。这就是通常说的多态。简单来说,多态意味着父类型的变量可以引用子类型的对象。
instanceof是Java的关键字。Java关键字中的每个字母都是小写的。
为了更好地理解类型转换,可以认为它们类似于动物、北极熊、熊猫之间的关系,其中动物类Animal是北极熊类Polar bear和熊猫类Panda类的父类。北极熊是动物,所以,总是可以将 Polar bear的实例安全地赋值给Animal变量。该关键字用法是判断某个对象是否属于某种数据类型,返回值为布尔类型。
Fu Zz=new Xu(); Fu Zzz=new yiting(); if(f1 instanceof Xu){ System.out.println("Zz是Xu的类型"); } else{ System.out.println("Zzz是yiting的类型"); }
总是可以将一个子类的实例转换为一个父类的变量,称为向上转换,因为子类的实例总是它的父类的实例。
作用:
package project2; class Animal{ int num=100; void say(){ System.out.println("It's an Animal."); } } class Cat extends Animal{ int num=50; void say(){ System.out.println("It's a Cat."); } void bark(){ System.out.println("喵喵喵!"); } } public class project2{ public static void main(String[] args) { Animal cat=new Cat();//向上转型 System.out.println(cat.num); cat.say(); // cat.bark(); } }
运行结果:
100
It's a Cat.
向上转型不要强制转型,父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。向上转型后父类引用不能调用子类自己的方法。
把一个父类的实例转换为它的子类变量。必须使用转换标记(子类名)进行显示转换,向编译器表明你的意图。为使转换成功,必须确保要转换的对象是子类的一个实例。
作用:
向上转型时 ,会遗失子类对象独有的其他方法;可以通过向下转型再重新转回。
package project2; class Animal{ int num=100; void say(){ System.out.println("It's an Animal."); } } class Cat extends Animal{ int num=50; void say(){ System.out.println("It's a Cat."); } void bark(){ System.out.println("喵喵喵!"); } } public class project2{ public static void main(String[] args) { Animal cat=new Cat();//向上转型 Cat cat2=(Cat) cat;//向下转型 System.out.println(cat2.num); cat2.say(); cat2.bark(); } }
运行结果:
50
It's a Cat.
喵喵喵!
提示:要重写一个方法,需要在子类中使用和父类一样的签名来对该方法进行定义。
子类从父类中继承方法。有时,子类需要修改父类中定义的方法的实现,这称为方法重写。
以下几点值得注意:
一个被final修饰的类和方法都不能被继承。被final修饰的数据域是一个常数。
有时候,可能希望防止类被继承。在这种情况下,使用final修饰符表明一个类是最终类,是不能作为父类的。Math类就是一个最终类。String、StringBuilder和StringBuffer类以及所有基本数据类型的包装类也都是最终类。例如,如下类A 就是最终类,不能被继承:
public final class A{ //Data fields,constructors, and methods omitted }
也可以定义一个方法为最终,最终方法不能被它的子类重写。例如如下,不能被重写:
public class Test { //Data fields,constructors, and methods omitted public final void m() { // Do something } }
注:修饰符public、protected、private、static、abstract以及final可以用在类和类的成员上,只有final修饰符还可以用在方法中的局部变量上。方法内的final局部变量就是常量。
酱酱~以上!是我学习多态暂时的内容~