多态是具有表现多种形态能力的特征。
通一个实现接口,使用不同实例而执行不同操作。
引用一个小例子会更明白:
A类:
public class A {
public String show(D obj){
return ("A --> D");
}
public String show(A obj){
return ("A --> A");
}
}
B类:
public class B extends A {
public String show(B obj){
return ("B --> B");
}
public String show(A obj){
return ("B --> A");
}
}
C类:
public class C extends B { }
D类:
public class D extends B{ }
Test类:
public class E {
public static void main(String[] args) {
A a1=new A();
A a2=new B();
B b=new B();
C c=new C();
D d=new D();
System.out.println(a1.show(b)); //A --> A
System.out.println(a1.show(c)); //A --> A
System.out.println(a1.show(d)); //A --> D
System.out.println(a2.show(b)); //B --> A
System.out.println(a2.show(c)); //B --> A
System.out.println(a2.show(d)); //A --> D
System.out.println(b.show(b)); //B --> B
System.out.println(b.show(c)); //B --> B
System.out.println(b.show(d)); //A --> D
}
}
a1.show(b):a1为A类对象,即使A类中没有参数为B的方法,但是B类继承于A,根据子类对象父类可用原则,会调用A中以A为参数的方法。 输出A–>A。
a1.show(c):a1为A类对象,即使A类中没有参数为C的方法,但是C类通过继承B类间接继承于A类,根据子类对象父类可用原则,会调用A中以A为参数的方法。 输出A–>A。
a1.show(d): a1为A类对象,a1中就有参数为D的方法show();。输出A –> D
a2.show(b):a2是B类向上转型的引用对象,即通过父类引用的对象,通过父类引用的对象只能访问到子类重写父类的方法,B类重写了父类的show(A obj)方法,所以只能访问到该方法。输出B –> A
a2.show(c):a2是B类向上转型的引用对象,即通过父类引用的对象,通过父类引用的对象只能访问到子类重写父类的方法,B类重写了父类的show(A obj)方法,所以只能访问到该方法。c为C类的对象,C类又继承B类间接继承了A类,根据子类对象父类可用原则。输出B –> A
a2.show(d): a2是B类向上转型的引用对象,即通过父类引用的对象,通过父类引用的对象可以访问到父类A里的方法,父类A类的方法里有D类参数。输出A –> D
b.show(b):b为B类对象,B类里包含以B为参数的show方法。输出B –> B
b.show(c):b为B类对象,c为C类对象引用,C类又继承于B类,根据子类对象父类可用原则,会调用包含B类引用的方法。输出B –> B
b.show(d):b为B类对象,d为D类对象,D类继承于B类间接继承于A类,A类中包含了以D类为参数的方法。输出A –> D
向上转型与向下转型
将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换。
此时通过父类的引用变量只能调用父类的全部非私有方法和子类重写父类的方法。
此时无法调用子类特有的方法。
要想引用到子类特有的方法,则需要将父类对象强制转换为子类对象的引用。
这种方法称为向下转型。
instanceof关键字
对象 instanceof 类或接口
该关键字用来判断一个对象是否属于一个类或者接口,
在强制类型转换前通过instanceof运算符检查对象的真实类型,再进行相应的类型转换,就可以避免类型转换异常。
使用instanceof关键字时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系。instanceof通常和强制类型转换结合使用。