继承是多态的基础,没有继承就没有多态,主要是借助方法重写和向上转型与向下转型。
定义:一个特定类型的变量可以引用不同类型的对象,并能自动调用引用对象的方法,根据作用到的不同对象类型,响应不同的操作。
好处:减少类中的代码量,提高代码的可扩展性和可维护性。
//是不是懵逼了,其实就是想变量一样,类是引用类型变量,他有好多的方法,子类可以直接调用父类方法,但是父类调用子类要强转//一个父类 A
public classA{public voidgongTong(){
syso("我是爸爸A");
}
}//一个子类B
public class B extendsA{//借助重写父类方法
public voidgongTong(){
syso("我是A的子类B");
}
}//调用
main方法中{//声明父类变量
A a;//将子类对象赋予
a = newB();//调用 子类重写父类的方法
a.gongTong();
}//你知道打印的是那句话,
我是A的子类B
注意:
1、多态意味着在一次方法调用中根据包含的对象实际类型来觉定调用的方法,不是由用来存储对象引用的变量类型决定的。
2、一般将父类,和被重写的方法进行抽象化,使用 abstract 关键字修饰。
3、抽象类不能实例化
4、abstract 不能和final 一块使用
5、abstract 修饰的方法没有方法体
6、private 不能修饰抽象方法
1.1、向上转型:子类向父类转化,父类声明,指向子类对象
格式:
父类 引用变量名 = new 子类();
注意:
1、将父类引用指向一个子类对象称为向上转型,系统会自动转化,调用的方法也是,子类重写父类的方法
2、通过父类引用变量,不能调用子类的特有方法
1.2、向下转型:父类转换为子类,将子类强转的父类的引用变量名,赋予该子类的引用变量名
格式:
子类 子类引用变量名 = (子类)父类引用变量名;
将一个指向子类对象的父类引用赋给一个子类引用,即将父类类型转换为子类类型,称为向下转型,要强转。
目的:调用子类特有方法,当然也可以调用重写的方法
向下转型必须转化为父类指向的真实子类类型,否则会出现,类型转换异常(ClassCastException),可借助instanceof运算符判断
1.3、instanceof 运算符:判断一个对象是否属于一个类
instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。
如果是返回true,否则返回false。
1.4、多态的使用
A、使用父类作为方法的形参
借助多态的向上转型,实例化不同的子类,控制不同子类重写的方法。
//主人类 使用父类作为方法形参
classHost{public voidletCry(Animal animal){//调用动物叫的方法
animal.cry();
}
}//调用
main{//实例化主人类
Host host = newHost();//声明动物父类
Animal animal;//向上转型,实例化狗
animal = newDog();//传递变量,狗叫
host.letCry(animal);//向上转型,实例化猫
animal = newCat();//传递变量,猫叫
host.letCry(animal);
........
}
B、使用父类作为方法的返回值
classHost{//父类作为方法返回值
publicAnimal donateAnimal(String type){//声明父类
Animal animal;//判断传递的类型,进行实例化
if(type=="dog"){
animal= newDog();
}else{
animal= newCat();
}//将符合的 传递出
returnanimal;
}
}//调用
main{//实例化主人列
Host host = newHost();//声明父类
Animal animal;//调用方法,传递参数
animal = host.donateAnimal("dog");//接受参数,调用方法
animal.cry();
}
1.5多态的优势
a、可替换性:对已经存在的代码具有可替换性
b、可扩充性:增加新的子类不影响已经存在类的多态性,继承性,以及其他特性的运行和操作
c、接口性:父类向子类提供一个共同接口,由子类实现
d、灵活性:在应用中体现了灵活的多样操作,提高了使用效率
e、简化性:简化了应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时