多态(polymorphism)
多态概念和实现:
多态是同一个方法,由于不同对象不同可能会有不同的方法。
多态的要点:
1、多态是方法的多态,不是属性的多态(多态与属性无关)
2、多态的存在要有三个条件:(1)继承(2)方法重写(3)父类引用指向子类对象
3、父类引用指向子类对象后,用该父类引用调用子类重写的方法时,此时多态就出现了。
*多态和类型转换
*/
package cn.test.polymorphism;
public class Animal {
public void shout(){
System.out.println("叫了一声!");
}
}
class Dog extends Animal{
public void shout(){
System.out.println("汪汪汪!");
}
public void seeDoor(){
System.out.println("看门中!");
}
}
class Cat extends Animal{
public void shout(){
System.out.println("喵喵喵!");
}
}
public class TestPolym {
public static void main(String[] args) {
Animal a1 = new Animal();//向上可以自动转型
//传的具体是哪一个类就调用那一个类的方法。大大提高了程序的可扩展性
animalCry(a1);//相当于animalCry(new Animal())
Animal a2 = new Dog();
animalCry(a2);//a2为编译类型,Dog对象才是运行时类型。
/*编写程序是,如果想调用运行时类型的方法,只能进行强制类型转换。
*否则通不过编译器的检查。 */
Dog dog = (Dog)a2;//向下不需要强制类型的转换
dog.seeDoor();
}
//有了多态,只需要让增加的这个类继承Animal类就可以了。
static void animalCry(Animal a){
a.shout();
}
/*如果没有多态,我们这里需要写很多重载的方法。
* 每增加一种动物,就需要重载一种动物的叫声,非常麻烦。
* static void animalCry(Dog d){
* d.shout();
* }
*/
}
多态的主要优点是提高了代码的可扩展性,符合开闭原则但是多态也有弊端,就是无法调用子类特有的功能
对象的转型(casting):
父类引用指向子类对象,我们成为向上转型,属于自动类型转换。
向上转型后的父类引用变量只能调用他编译类型的方法,不能调用他运行时的方法。这时,我们就需要进行类型转换,我们称为向下转换。
/*
* 对象的转型
*/
package cn.test.polymorphism;
public class TestCasting {
public static void main(String[] args) {
Object obj = new String("春秋战国");//父类引用指向子类对象
// obj,charAt(0)无法调用,编译器认为obj是object类型而不是String类型
/*编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
* 不然通不过编译器的检查
*/
String str = (String)obj;//向下转型(object类型转向String类型)
System.out.println(str.charAt(0));//位于0索引位置的字符
System.out.println(obj == str);//true,他们运行时是同一个对象
}
}
在向下转型过程中,必须将引用变量转为真实的子类类型(运行时类型)否则会出现类型转换异常ClassCastingExceotion
* 类型转换异常
*/
package cn.test.polymorphism;
public class TestCasting2 {
public static void main(String[]args){
Object obj = new String("秦王扫六合");
//真实的子类类型是String,但是此处向下转型为StringBuffer
StringBuffer str = (StringBuffer) obj;
System.out.println(str.charAt(0));
}
}
为避免出现这种异常,我们可以使用instanceof 运算符进行判断`
* 向下转型中使用instanceof
*/
package cn.test.polymorphism;
public class TestCasting3 {
public static void main(String[]args){
Object obj = new String("虎视何雄哉");
//父类引用指向子类对象
if(obj instanceof String){
String str = (String)obj;//向下强转:Object类型转为String类型
System.out.println(str.charAt(0));
}else if(obj instanceof StringBuffer){
StringBuffer str = (StringBuffer)obj;
System.out.println(str.charAt(0));
}
}
}
1、多态是:同一个方法,由于不同对象不同可能会有不同的方法。
2、多态的三个条件:继承、方法重写、父类引用指向子类对象